К сожалению данная функциональность не включена в модуль threading. В сети можно найти уже готовые реализации (см. альтернативы). Не знаю почему, но я решил написать подобную функциональность самостоятельно. Тем более, что мне нужна только одна функциональность imap() - интерактивный map, позволяющий выполнить функцию для каждого элемента из набора входных данных и вернуть результат. В отличии от стандартного map() выполнение функции происходит параллельно.
Пример использования
import time
import random
from threads import Pool
def f():
t = random.randint(1,5)
time.sleep(t)
return 'sleep %d' % t
p = Pool(3)
it = p.imap(f, range(5))
it.setTimeout(6)
for d in it: print dСоздается пул из трех процессов. В него через метод imap() передается функция и набор из 5 случайных значений. Единственное, что делает функция, так это ожидает случайный интервала времени (от 1 до 5 секунд). Это достаточно интересный момент. В зависимости от входных данных, время выполнения функции может быть различно. Именно поэтому рекомендуется устанавливать значение таймера методом setTimeout - время, сколько ожидать результат выполнения функции.
Исходный код модуля threads.py
Альтернативы
Threadpool
Thread pool with same API as (multi)processing.Pool
Дополнительные ссылки
multiprocessing.Pool.imap
intertools.imap



0 комментариев:
Отправить комментарий