Как установить время ожидания для функции, которая использует многопроцессорность? - PullRequest
1 голос
/ 26 февраля 2020

У меня есть функция, которая использует 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, и мне нужно иметь один тайм-аут для всего пула (например, если есть миллион вызовов, каждый довольно короткий, но вместе они занимают много времени).

Более того, в общем, я хотел бы тайм-аут какой-то очень большой части кода, включая пул (иногда тайм-аут может даже произойти до пула), но, похоже, для этого нет решения ...

...