Я экспериментирую с модулем multiprocessing
.Рассмотрим этот код:
import multiprocessing
#simple function
def f(x):
return x**2
S = 0
#create workers
pool = multiprocessing.Pool(15)
#outer loop
for x_min in range(20):
results = []
for x in xrange(x_min, x_min+15):
#new process for each x value
results.append(pool.apply_async(f, args=(x,)))
#is it guaranteed that processes will join here?
S = S+sum([res.get() for res in results])
print S
Идея состоит в том, что у меня есть внешний цикл, который имеет внутренний цикл.Внутренний цикл вызывает функцию f(x)
для серии значений x
, и я хочу назначить эти вызовы для отдельных процессов, чтобы выполнить их параллельно.Последующие итерации во внешнем цикле, однако, зависят от предыдущих результатов, поэтому внешний цикл не может быть распараллелен.
Мой вопрос: есть ли гарантия, что 15 процессов будут ждать друг друга на каждой итерации внешнего цикла, прежде чем вычислять sum
?Другими словами, строго говоря о результате, является ли приведенный выше код всегда эквивалентным простому вызову f(x)
вместо apply_async
?
В более общем смысле вызов функции get()
для результатов apply_async
всегда будете ждать в этот момент, пока не будут возвращены результаты всех процессов?