Я хочу выполнить несколько задач параллельно в нескольких подпроцессах и установить тайм-аут, если задачи не были выполнены в течение некоторой задержки.
Первый подход заключается в разветвлении и объединении подпроцессов по отдельности с оставшимися тайм-аутами, рассчитанными относительно глобального тайм-аута, как предложено в в этом ответе . У меня отлично работает.
Второй подход, который я хочу использовать здесь, состоит в создании пула подпроцессов и ожидании с глобальным таймаутом, как предложено в этом ответе .
Однако у меня есть проблема со вторым подходом: после заполнения пула подпроцессов задачами, имеющими multiprocessing.Event()
объекты, ожидание их завершения вызывает это исключение:
RuntimeError: объекты условий должны быть общими только для процессов через наследование
Вот фрагмент кода Python:
import multiprocessing.pool
import time
class Worker:
def __init__(self):
self.event = multiprocessing.Event() # commenting this removes the RuntimeError
def work(self, x):
time.sleep(1)
return x * 10
if __name__ == "__main__":
pool_size = 2
timeout = 5
with multiprocessing.pool.Pool(pool_size) as pool:
result = pool.map_async(Worker().work, [4, 5, 2, 7])
print(result.get(timeout)) # raises the RuntimeError