У меня очень функция с одним аргументом, который также является возвращаемым значением. Когда imap_unordered используется с этой функцией, ее выходные данные длиннее, чем итерируемые, переданные imap_unordered. Как это возможно? Я использую Anaconda python 3.6.5, в то время как на стандартном python 3 этой проблемы нет.
Вот код всего скрипта:
from multiprocessing import Pool
def func(i):
return i
iterable = [i for i in range(20)]
counter = 0
with Pool(4,maxtasksperchild=2) as p:
for out in p.imap_unordered(func,iterable):
counter += 1
print(counter)
А теперь вывод:
1
2
3
4
5
6
7
8
9
10
9
10
11
12
13
14
15
16
17
18
19
20
Почему цифры не линейно растут в объеме производства? (посмотрите на 9,10,9,10
, должно быть 9,10,11
)
Во-первых, я подумал, что проблема в функции imap_unordered, поскольку она не возвращает упорядоченный вывод, но это не так, поскольку скрипт не печатаетвывод отображенной функции, но просто печатает значение переменной счетчика, которое должно увеличиваться на 1 каждый раз в цикле. Это просто обычный цикл, в котором некоторая переменная увеличивается на 1 после каждой итерации.
Что ж, когда аргумент maxtasksperchild
не используется, вывод выводится правильно.
Кто-нибудь знает, почему такое поведениеприсутствует при использовании maxtasksperchild
?