У меня есть функция, которая использует multiprocessing.pool
для выполнения некоторых тяжелых вычислений (смоделированных с sleep(5)
), и я хочу иметь тайм-аут, который завершает это вычисление, если оно занимает слишком много времени, и заранее закрывает пул.
def add_const(number, const):
print('Adding', const,'to', number)
time.sleep(5)
return number+const
def function_parallel(list_of_numbers, const):
pool = Pool(2)
data=pool.imap(functools.partial(add_const, const=const), list_of_numbers)
pool.close()
pool.join()
return(data)
Я пытался использовать модуль stopit
(https://pypi.org/project/stopit/), но он не работал.
t1 = time.time()
with stopit.ThreadingTimeout(2) as to_ctx_mgr:
assert to_ctx_mgr.state == to_ctx_mgr.EXECUTING
result=[]
data=function_parallel([1, 2], 2)
for i in data:
result.append(i)
if to_ctx_mgr.state == to_ctx_mgr.TIMED_OUT:
result.append('timeout')
print(result)
print(time.time()-t1)
С map
в function_parallel
это заняло 5 секунд вместо остановки после 2, и это также оставило процессы зомб ie. * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * 1) Есть ли безопасный и надежный способ тайм-аута этой функции? Спасибо!
Редактировать:
К сожалению, я не смог применить pebble
к моей проблеме. Это позволяет установить тайм-аут для каждого вызова add_const
, и мне нужно иметь один тайм-аут для всего пула (например, если есть миллион вызовов, каждый довольно короткий, но вместе они занимают много времени).
Более того, в общем, я хотел бы тайм-аут какой-то очень большой части кода, включая пул (иногда тайм-аут может даже произойти до пула), но, похоже, для этого нет решения ...