Как передать KeyboardInterrupt работникам многопроцессорного пула и корректно выйти?Linux

Ответить
Anonymous
 Как передать KeyboardInterrupt работникам многопроцессорного пула и корректно выйти?

Сообщение Anonymous »

Я использую multiprocessing.Pool в Python для распараллеливания задачи, требующей входа и выхода из контекстного менеджера для каждого элемента рабочей нагрузки. Я хочу гарантировать, что при возникновении KeyboardInterrupt программа корректно завершает работу, позволяя каждому рабочему процессу завершить метод exit своего контекстного менеджера, распространяя прерывание (или что-то в этом роде).
Вот простой фрагмент кода, иллюстрирующий мои мысли:

Код: Выделить всё

class MyContext:
def __init__(self, name):
self.name = name

def __enter__(self):
print(f'Entering context {self.name}')
return self

def __exit__(self, exc_type, exc_value, traceback):
print(f'Exiting context {self.name}')
time.sleep(5)
print(f'Exited context {self.name}')

def process_name(name):
with MyContext(name):
print(f'Processing {name}')
time.sleep(100)
print(f'Finished {name}')

names = ['Alice', 'Bob']

for name in names:
process_name(name)
Вот ожидаемый результат:

Код: Выделить всё

Entering context Alice
Processing Alice
Entering context Bob
Processing Bob
^CExiting context Alice
Exiting context Bob
Exited context Alice
Exited context Bob
KeyboardInterrupt (maybe multiple times)
Вот фактический результат:

Код: Выделить всё

Entering context Alice
Processing Alice
Entering context Bob
Processing Bob
^CExiting context Alice
Exiting context Bob
KeyboardInterrupt
Метод exit контекстного менеджера вызывается, но он не завершается до сбоя программы. Что мне следует изменить, чтобы все работало так, как задумано?

Подробнее здесь: https://stackoverflow.com/questions/792 ... -gracefull
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»