Странный результат в python с использованием функции multiprocessing.Pool? - PullRequest
0 голосов
/ 29 сентября 2018

Вот код:

один:

import multiprocessing
import datetime
import time
a = [i for i in range(100)]
res1 = []
def jia(a,b,c):
    time.sleep(0.1)
    return a + b + c
res1_time_start = datetime.datetime.now()
p = multiprocessing.Pool(4)
res1 = [p.apply_async(jia,(i,1,1)) for i in a]
res1 = [i.get() for i in res1]
res1_time_end = datetime.datetime.now()
print((res1_time_end - res1_time_start).seconds)

другой:

import multiprocessing
import datetime
import time
a = [i for i in range(100)]
res1 = []
def jia(a,b,c):
    time.sleep(0.1)
    return a + b + c
res1_time_start = datetime.datetime.now()
p = multiprocessing.Pool(4)
for i in a:
    res1.append(p.apply_async(jia,(i,1,1)).get())
res1_time_end = datetime.datetime.now()
print((res1_time_end - res1_time_start).seconds)

Странный результат: первый стоит 2,5 с, а второй -10s.Почему? Блоки блоков list.append обрабатываются?

1 Ответ

0 голосов
/ 29 сентября 2018

Нет, append() не блокирует, а .get() блокирует.Это цель из .get() для блокировки.В

res1 = [p.apply_async(jia,(i,1,1)) for i in a]
res1 = [i.get() for i in res1]

all работа передается в пул первой строкой, прежде чем any .get() будет вызвана второй строкой.Но в

for i in a:
    res1.append(p.apply_async(jia,(i,1,1)).get())

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

...