В Python, каковы недостатки вызова os.waitpid в программе с несколькими потоками? - PullRequest
3 голосов
/ 17 апреля 2011

Я слышал, что есть проблемы при вызове os.waitpid из потока. Я еще не сталкивался с такими проблемами (особенно при использовании опции os.WNOHANG). Однако я не уделил большого внимания влиянию производительности на такое использование.

Существуют ли какие-либо проблемы с производительностью или другие проблемы, о которых следует знать? Связано ли это с os.waitpid (потенциально) с использованием сигналов?

Я не понимаю, как сигналы могут быть связаны, так как в противном случае (я полагаю) я не смог бы получить os.waitpid для возврата при вызове его из неосновного потока.

Ответы [ 2 ]

0 голосов
/ 05 июля 2011

По умолчанию дочерний процесс умирает, родителю отправляется сигнал SIGCHLD.Вероятно, это связано с вызовом os.waitpid ().

Если вы посмотрите документацию модуля Python "signal", предупреждение довольно ясно:

Необходимо соблюдать осторожность.если оба сигнала и потоки используются в одной программе.Фундаментальная вещь, которую следует помнить при одновременном использовании сигналов и потоков: всегда выполнять операции signal () в основном потоке выполнения.Любой поток может выполнить alarm (), getsignal (), pause (), setitimer () или getitimer ();только основной поток может установить новый обработчик сигнала, и основной поток будет единственным, который будет принимать сигналы (это обеспечивается модулем сигналов Python, даже если реализация базового потока поддерживает отправку сигналов отдельным потокам).Это означает, что сигналы не могут использоваться как средство межпотоковой связи.Вместо этого используйте блокировки.

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

НО ... если вы оставите сигнал SIGCHLD в покое, то вы с радостью сможете вызвать os.waitpid () (или любой другойдругой вариант os.wait ()) из потока.

Основным недостатком является то, что вам нужно будет использовать os.waitpid () с WNOHANG и периодически опрашивать, если вы хотите каким-либо образом отменить операцию,Если вам не нужно отменять os.waitpid (), вы можете просто вызвать его в режиме блокировки.

0 голосов
/ 17 апреля 2011

Мое предположение: люди просто ссылаются на вызов waitpid () без WNOHANG, что, конечно, устраняет причину, по которой вы используете несколько потоков. (Это, конечно, если только вы не используете его, чтобы пожинать зомби).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...