В многопроцессорном модуле уже есть решение для параллельной обработки задач: multiprocessing.Pool
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
with Pool(processes=4) as pool: # start 4 worker processes
print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]"
Вы можете добиться того же, используя multiprocessing.Queue
.Я считаю, что именно так pool.map()
реализуется внутри.
Итак, в чем разница между multiprocessing.Queue
и multiprocessing.Pipe
?Queue
это просто Pipe
плюс некоторый механизм блокировки.Поэтому несколько рабочих процессов могут совместно использовать только один Queue
(или, точнее, 2 - один для команд, один для результатов), но для Pipe
каждому процессу потребуется собственный Pipe
(или пара, или дуплексный).), именно так, как вы это делаете сейчас.
Единственный недостаток Queue
- это производительность - поскольку все процессы используют один мьютекс очереди, он плохо масштабируется для многих процессов.Чтобы быть уверенным, что он может обрабатывать десятки тысяч элементов / с, я бы выбрал Pipe
, но для классического варианта использования параллельной обработки я думаю, что Queue
или просто Pool.map()
могут быть в порядке, потому что их гораздо проще использовать.(Управление процессами может быть сложным, и asyncio также не облегчает его.)
Надеюсь, это поможет, я знаю, что я ответил на несколько иной вопрос, чем вы задавали:)