почему обработка SIGTERM портит обработку Pool.map ()?

#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 работникам пула через контекстный менеджер, когда работа выполнена, поэтому такое поведение, по-видимому, связано.