Потоки не выполняются под супервизором

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

Вот код, который создает потоки:

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

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


person conquester    schedule 10.09.2016    source источник
comment
Откуда берутся записи и куда идет журнал? У вас другое имя пользователя и текущий рабочий каталог при использовании супервизора, и вы потенциально используете другие файлы, чем вы думаете.   -  person tdelaney    schedule 10.09.2016


Ответы (3)


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

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

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

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

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

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

person Evren Yurtesen    schedule 10.09.2016
comment
Я пытался использовать многопроцессорность. Те же результаты. Тем не менее я не могу понять, почему все потоки запускаются при запуске из оболочки как «python crawler.py», но когда я добавляю его как задание в супервизоре, всегда запускаются только те же два потока. - person conquester; 10.09.2016
comment
Возможно, это может помочь, если вы расскажете нам, как именно вы регистрируете количество запущенных вами потоков? Другими словами, как определить количество запущенных потоков? - person Evren Yurtesen; 10.09.2016
comment
Нити предопределены. 5 тем для 5 сайтов. Также я обновил вопрос, чтобы отразить новые события. - person conquester; 10.09.2016

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

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

Итак, ответ таков: daemon = true при запуске скрипта самостоятельно, false при запуске под супервизором.

person Chris Barry    schedule 28.09.2017

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

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

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

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

person pelson    schedule 25.10.2017