3

J'ai entendu dire qu'il y avait des problèmes lors de l'appel de os.waitpid depuis un thread. Je n'ai pas encore rencontré de tels problèmes (en particulier en utilisant l'option os.WNOHANG). Cependant, je n'ai pas prêté beaucoup d'attention aux implications de performance d'une telle utilisation.En Python, quels sont les inconvénients d'appeler os.waitpid dans un programme avec plusieurs threads?

Y a-t-il des pénalités de performance ou d'autres problèmes dont il faut être conscient? Est-ce que cela a à voir avec os.waitpid (potentiellement) en utilisant des signaux?

Je ne vois pas comment les signaux pourraient être liés, car sinon (je suppose que) je ne serais pas en mesure d'obtenir os.waitpid à retourner en l'appelant à partir d'un thread non principal.

Répondre

0

Par défaut, un processus enfant meurt, le parent reçoit un signal SIGCHLD. Le souci d'appeler os.waitpid() vient probablement de ceci.

Si vous regardez dans la documentation du module « signal » l'avertissement Python est assez clair:

Certaines précautions doivent être prises si les deux signaux et les fils sont utilisés dans le même programme. La chose fondamentale à retenir lors de l'utilisation simultanée de signaux et de threads est la suivante: effectuez toujours des opérations signal() dans le thread principal d'exécution. N'importe quel thread peut effectuer une alarme(), getsignal(), pause(), setitimer() ou getitimer(); seul le thread principal peut définir un nouveau gestionnaire de signal, et le thread principal sera le seul à recevoir des signaux (ceci est imposé par le module de signal Python, même si l'implémentation de thread sous-jacente supporte l'envoi de signaux à des threads individuels). Cela signifie que les signaux ne peuvent pas être utilisés comme moyen de communication inter-thread. Utilisez des verrous à la place.

http://docs.python.org/library/signal.html

MAIS ... si vous laissez seul le signal SIGCHLD, alors vous devriez être heureux de pouvoir appeler os.waitpid() (ou toute autre variante os.wait()) à partir d'un fil .

L'inconvénient principal est que vous devrez utiliser os.waitpid() avec WNOHANG et interroger périodiquement, si vous voulez annuler l'opération. Si vous n'avez jamais besoin d'annuler os.waitpid(), vous pouvez simplement l'invoquer en mode bloquant.

0

Ma conjecture: les gens font simplement référence à l'appel de waitpid() sans WNOHANG, ce qui, bien sûr, évite la raison pour laquelle vous utilisez plusieurs threads en premier lieu. (C'est, bien sûr, à moins que vous ne l'utilisiez pour récolter les zombies).

Questions connexes