2016-09-10 3 views
2

Я работаю над базовым искателем, который сканирует 5 веб-сайтов одновременно с использованием потоков. Для каждого сайта создается новый поток. Когда я запускаю программу из оболочки, выходной журнал показывает, что все 5 потоков выполняются так, как ожидалось. Но когда я запускаю эту программу как программу supervisord, тогда журнал показывает, что каждый раз запускается всего 2 потока! Журнал показывает, что все 5 потоков запущены, но только те же два из них выполняются, а остальные застревают. Я не могу понять, почему эта несогласованность происходит, когда она запускается из оболочки и когда она запускается из диспетчера. Есть ли что-то, что я не принимаю во внимание?Нитки не выполняются под супервизором

Вот код, который создает тему:

for sid in entries: 
    url = entries[sid] 
    threading.Thread(target=self.crawl_loop, \ 
        args=(sid, url)).start() 

ОБНОВЛЕНИЯ: Как было предложено tdelaney в комментариях, я изменил рабочий каталог в конфигурации supervisord и теперь все нити выполняются в настоящее время как и ожидалось. Хотя я до сих пор не понимаю, почему установка рабочего каталога в каталог файла искателя устраняет проблему. Возможно, кто-то, кто знает о том, как супервайзер управляет процессами, может объяснить?

+0

Откуда берутся записи и куда ведет журнал? У вас есть другое имя пользователя и текущий рабочий каталог при использовании supervisord, и вы потенциально используете разные файлы, чем вы думаете. – tdelaney

ответ

1

Нити AFAIK python не могут правильно создавать потоки, потому что они не являются потокобезопасными. Это просто дает вам возможность имитировать одновременный запуск кода. Ваш код по-прежнему будет использовать только 1 ядро.

https://wiki.python.org/moin/GlobalInterpreterLock

https://en.wikibooks.org/wiki/Python_Programming/Threading

Поэтому вполне возможно, что он не порождать больше процессов/потоков.

Вы должны использовать многопроцессорную обработку, я думаю?

https://docs.python.org/2/library/multiprocessing.html

+0

Я пробовал использовать многопроцессорную обработку. Те же результаты.Тем не менее я не могу понять, почему все потоки запускаются при запуске из оболочки как «python crawler.py», но когда я добавляю его как задание в супервизор, то будут выполняться только те же 2 потока. – conquester

+0

Возможно, это может помочь, если вы можете сообщить нам, как вы точно регистрируете количество потоков, которые вы используете? Другими словами, как определить количество потоков? –

+0

Потоки заданы. 5 потоков для 5 веб-сайтов. Также я обновил вопрос, чтобы отразить новые разработки. – conquester

0

я имел ту же самую тихую проблему, но потом понял, что установка демона верно, который был причиной проблем супервизора.

https://docs.python.org/2/library/threading.html#threading.Thread.daemon

Так что ответ, демон = истина при запуске скрипта себя, ложный при работе под супервизором.

0

Просто сказать, что у меня была очень похожая проблема.

В моем случае я работал на машине с низким энергопотреблением (RaspberryPi) с потоками, предназначенными для прослушивания последовательного устройства (Arduino nano on/dev/ttyUSB0). Код отлично работал в командной строке, но поток последовательного чтения застопорился под диспетчером.

После небольшого взлома (и попробовав все варианты здесь) я попытался запустить python в небуферизованном режиме и смог решить проблему! Я получил идею от https://stackoverflow.com/a/17961520/741316.

В сущности, я просто вызвал python с флагом -u.

Смежные вопросы