0

У меня возникла проблема с каркасом Cement для python (с использованием python3 на данный момент). У меня есть многопроцессорное приложение, в котором работают сотрудники пула python. Конец (это ДУС не мешает с результатами) каждого multiporcessing раздела мой стандартный вывод заполняется одним или несколькими из этих исключений:Цементная рамка принимает сигнал 15 на рабочем столе пула

Traceback (most recent call last): 
    File "/usr/lib/python3.5/multiprocessing/util.py", line 254, in _run_finalizers 
    finalizer() 
    File "/usr/lib/python3.5/multiprocessing/util.py", line 186, in __call__ 
    res = self._callback(*self._args, **self._kwargs) 
    File "/usr/lib/python3.5/multiprocessing/queues.py", line 198, in _finalize_join 
    thread.join() 
    File "/usr/lib/python3.5/threading.py", line 1054, in join 
    self._wait_for_tstate_lock() 
    File "/usr/lib/python3.5/threading.py", line 1070, in _wait_for_tstate_lock 
    elif lock.acquire(block, timeout): 
    File "/home/yogaub/.virtualenvs/seminar/lib/python3.5/site-packages/cement/core/foundation.py", line 123, in cement_signal_handler 
    raise exc.CaughtSignal(signum, frame) 
cement.core.exc.CaughtSignal: Caught signal 15 

Кто-нибудь знает, почему это происходит, и как это предотвратить?

Благодаря

редактировать: Я хотел бы добавить, что я хочу войти с лесозаготовительной нескольких процессов системы this question. Я не знаю, есть ли какая-либо корреляция.

edit2: Это создание пула процесс и завершение:

pool = Pool(processes=core_num) 
pool.map(worker_unpacker.work, formatted_input) 
pool.close() 
t2 = time.time() 

Я попытался поймать SIGTERM с системой крючками Cement, но она не работает. Единственное решение, которое я нашел на данный момент, - это фактически полностью игнорировать сигналы в конфигурации приложения для цемента (но это не действительно решение, которое мне нравится ...).

+0

сигнал 15 является 'SIGTERM' и может произойти, если вы отправите сигнал уничтожения процессу, выполняете ли вы' terminate() 'в процессе? Можете ли вы поделиться частью программы, в которой вы настроили пул, запустить и «присоединиться» к нему? – hansaplast

+0

@hansaplast Спасибо, да, я понял, что это сигммер. То, что я действительно не знаю, это то, кто его генерирует и почему он не улавливается цементом (даже когда я явно настраиваю крючок). – ClonedOne

ответ

0

Это обоснованное предположение: родительский процесс убивает (terminate() s) запущенные процессы при выходе. Если вы вызываете pool.join() в родительском процессе, то родительский процесс ожидает завершения всех подпроцессов и не отправит им SIGTERM.

+0

Спасибо! Явный вызов 'pool.join()' сделал трюк. Странно, однако, поскольку в документе python указано, что 'close() Предотвращает отправку дополнительных заданий в пул. Как только все задачи будут завершены, рабочие процессы выйдут. « По-прежнему меня это немного беспокоит, что цементный крючок его не поймал. – ClonedOne

+0

Да, когда родительский процесс вызывает 'close()', и процесс завершает функцию, то он завершается нормально. Вы имели в виду, что родительский процесс так долго не ждал, он уже вышел из себя, прежде чем рабочие закончили. Таким образом, он разорвал рабочих с ним, чтобы сказать так. 'join()' explicetly сообщает родительскому процессу дождаться завершения всех подпроцессов до выхода – hansaplast

+0

@ClonedOne, если вы хотите получить больше объяснений, скажите, пожалуйста, я старался изо всех сил :-) – hansaplast