Эта строка в вашем коде:
Pool(processes=4, initializer=initializer) as pool: # start 4 worker processes
не запускает 4 рабочих процесса.Он просто создает их пул, который может поддерживать одновременную работу многих из них.Такие методы, как apply()
, на самом деле запускают отдельные процессы.
Разница в том, что apply()
и apply_async()
состоят в том, что первые блокируют до тех пор, пока результат не будет готов, а последние возвращают объект "результат" прямодалеко.Это не имеет большого значения, если вы не хотите отправлять более чем одну задачу в Pool
за один раз (что, конечно, является основным смыслом использования модуля multiprocessing
).
Вот некоторыеИзменения в вашем коде, показывающие, как на самом деле выполнять некоторую параллельную обработку с Pool
:
from multiprocessing import Pool
import time
import os
def initializer():
print("In initializer pid is {} ppid is {}".format(os.getpid(),os.getppid()))
def f(x):
print("In f pid is {} ppid is {}".format(os.getpid(),os.getppid()))
return x*x
if __name__ == '__main__':
print("In main pid is {} ppid is {}".format(os.getpid(), os.getppid()))
with Pool(processes=4, initializer=initializer) as pool: # Create 4 worker Pool.
# result = pool.apply(f, (10,)) # evaluate "f(10)" in a single process
# print(result)
# Start multiple tasks.
tasks = [pool.apply_async(f, (val,)) for val in range(10, 20)]
pool.close() # No more tasks.
pool.join() # Wait for all tasks to finish.
results = [result.get() for result in tasks] # Get the result of each.
print(results)
map_sync()
, лучше подходят для обработки чего-то подобного (последовательности значений), поскольку он будет обрабатывать некоторыеиз деталей, показанных в приведенном выше коде автоматически.