#python #dictionary #multiprocessing #signals #pool
Вопрос:
Когда я добавляю обработку сигналов, а именно SIGTERM
в код , который используется multiprocessing.Pool.map()
в цикле, это приводит к зависанию после неопределенного числа итераций, по крайней мере, с Python 3.8 в Ubuntu 20.04 (x86).
#!/usr/bin/env python3
import threading
import signal
from multiprocessing import Pool, cpu_count
def handler(num, frame):
pass
def worker():
pass
def runpool():
work_tasks = []
with Pool(processes=cpu_count()) as pool:
try:
results = pool.map(worker, work_tasks, 1)
except Exception as exc:
print("exc: {}".format(exc))
def worker_function():
while True:
print("run")
runpool()
args = []
my_thread = threading.Thread(target=worker_function, name="my thread",
args=args, daemon=True)
my_thread.start()
signal.signal(signal.SIGTERM, handler)
while True:
siginfo = signal.sigwaitinfo({signal.SIGTERM})
print("got %d from %d by user %dn" % (siginfo.si_signo,
siginfo.si_pid,
siginfo.si_uid))
В частности, именно signal.signal()
вызов приводит к такому поведению.
При запуске эта программа печатает кучу "run"
и зависает. KeyboardInterrupt
Стек выглядит так:
Traceback (most recent call last):
File "/usr/lib/python3.8/multiprocessing/process.py", line 315, in _bootstrap
self.run()
File "/usr/lib/python3.8/multiprocessing/process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "/usr/lib/python3.8/multiprocessing/pool.py", line 114, in worker
task = get()
File "/usr/lib/python3.8/multiprocessing/queues.py", line 355, in get
with self._rlock:
File "/usr/lib/python3.8/multiprocessing/synchronize.py", line 95, in __enter__
return self._semlock.__enter__()
Кто-нибудь знает, почему это так ? Является ли это ограничением самого Python или вышеприведенная программа закодирована неправильно ?
Я знаю, что обработка пула отправляется SIGTERM
работникам пула через контекстный менеджер, когда работа выполнена, поэтому такое поведение, по-видимому, связано.