Как получить точное время ожидания с помощью многопроцессного Python apply_async? - PullRequest
0 голосов
/ 07 января 2019

Я использую многопроцессорный пул для параллельного запуска пакета заданий. Я хочу дать каждой работе 2 секундный срок. То есть я хочу убить задание, если оно занимает более 2 секунд, и перейти к следующему заданию.

Вот мой код

from multiprocessing import Pool, TimeoutError                                                                                                 
import time                                                                                                                                    
import os                                                                                                                                      
import random                                                                                                                                  

def f():                                                                                                                                                                                                                                                           
    time.sleep(3)
    return True                                                                                                                            

if __name__ == '__main__':                                                                                                                                                                                                            
    with Pool(processes=8) as pool:
    multiple_results = [pool.apply_async(f, ()) for i in range(16)]
    for res in multiple_results:                                                                                                           
        try:                                                                                                                               
            print (res.get(timeout=2)),                                                                                                   
        except:                                                                                                                            
            print ("TO"), 

Я ожидаю, что будет напечатано 16 TO s, однако я получу TO True True True True ... Это означает, что большая часть выполнения функции f будет успешной , Я не ожидал этого, так как думал, что установил тайм-аут на 2 секунды для каждого порожденного процесса. У меня возникли некоторые недоразумения по поводу использования функции apply_async? Или есть лучший способ добиться того, что я хочу сделать?

1 Ответ

0 голосов
/ 08 января 2019

Время ожидания для функции AsyncResult.get не прекращает текущее задание. Он просто блокируется до timeout секунд, а затем вызывает TimeoutError, позволяя основному потоку возобновить выполнение.

Таким образом, все остальные задания в очереди правильно обрабатываются в фоновом режиме, пока вы ожидаете первого результата, и, следовательно, вы наблюдаете такое поведение.

Если вы хотите, чтобы работа была остановлена ​​по тайм-ауту, вам нужно полагаться на реализации пула сторонних производителей, такие как billiard или pebble.

...