Скрученный сетевой клиент с многопроцессорными рабочими?

Я знаю с Digg, можно связаться с ними и запросить, чтобы они поместили в черный список сайт. Можно, вероятно, сделать то же с Slashdot.

7
задан Hans L 24 September 2009 в 10:28
поделиться

2 ответа

Поскольку разница между вашим рабочим вызовом и нерабочим вызовом заключается только в параметре «-n», наиболее вероятно, что проблема вызвана процессом демонизации (который «-n "предотвращает возникновение).

В POSIX одним из этапов демонизации является разветвление и наличие родительского выхода. Среди прочего, это приводит к тому, что ваш код запускается в процессе, отличном от того, в котором оценивался файл .tac. Это также перестраивает отношения дочерних / родительских процессов, которые были запущены в файле .tac, как и ваш пул многопроцессорных процессов.

Процессы многопроцессорного пула начинаются с родителя процесса twistd, который вы запускаете. Однако, когда этот процесс завершается как часть демонизации, их родитель становится процессом инициализации системы. Это может вызвать некоторые проблемы, хотя, вероятно, это не проблема зависания, которую вы описали. Вероятно, существуют другие подобные низкоуровневые детали реализации, которые обычно позволяют многопроцессорному модулю работать, но которые прерываются процессом демонизации.

К счастью, избежать этого странного взаимодействия должно быть несложно. Сервисные API Twisted позволяют запускать код после завершения демонизации. Если вы используете эти API, вы можете отложить инициализацию пула процессов многопроцессорного модуля до завершения демонизации и, надеюсь, избежать проблемы. Вот пример того, как это может выглядеть:

from twisted.application.service import Service

class MultiprocessingService(Service):
    def startService(self):
        self.pool = multiprocessing.Pool(processes=processes)

MultiprocessingService().setServiceParent(application)

Теперь, отдельно, вы также можете столкнуться с проблемами, связанными с очисткой дочерних процессов многопроцессорного модуля, или, возможно, проблемы с процессами, созданными с помощью API создания процессов Twisted, response.spawnProcess. Это связано с тем, что часть правильной работы с дочерними процессами обычно включает обработку сигнала SIGCHLD. Однако Twisted и multiprocessing не будут сотрудничать в этом отношении, поэтому один из них получит уведомление о выходе всех дочерних элементов, а другой никогда не будет уведомлен. Если вы вообще не используете Twisted API для создания дочерних процессов, тогда это может быть для вас нормально, но вы можете проверить, чтобы убедиться, что любой обработчик сигналов, который пытается установить модуль multiprocessing, действительно «выигрывает» и не получает заменен собственным обработчиком Twisted.

Это связано с тем, что часть правильной работы с дочерними процессами обычно включает обработку сигнала SIGCHLD. Однако Twisted и multiprocessing не будут сотрудничать в этом отношении, поэтому один из них получит уведомление о выходе всех дочерних элементов, а другой никогда не будет уведомлен. Если вы вообще не используете Twisted API для создания дочерних процессов, тогда это может быть для вас нормально, но вы можете проверить, чтобы убедиться, что любой обработчик сигналов, который пытается установить модуль multiprocessing, действительно «выигрывает» и не получает заменен собственным обработчиком Twisted.

Это связано с тем, что часть правильной работы с дочерними процессами обычно включает обработку сигнала SIGCHLD. Однако Twisted и multiprocessing не будут сотрудничать в этом отношении, поэтому один из них получит уведомление о выходе всех дочерних элементов, а другой никогда не будет уведомлен. Если вы вообще не используете Twisted API для создания дочерних процессов, тогда это может быть для вас нормально, но вы можете проверить, чтобы убедиться, что любой обработчик сигналов, который пытается установить модуль multiprocessing, действительно «выигрывает» и не получает заменен собственным обработчиком Twisted.

12
ответ дан 6 December 2019 в 21:16
поделиться

Возможная идея для вас ...

При работе в режиме демона twistd закроет stdin, stdout и stderr. Читают или записывают в них что-то из того, что ваши клиенты?

0
ответ дан 6 December 2019 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: