据我所知,在以下代码段中,正在创建一个由两个进程组成的池,然后主脚本进入无限循环,同时不断地检查消息,并将任务委托给某个功能action_fn
(如果找到)消息。
p = Pool(processes = 2)
while True:
message = receive_message_from_queue()
if message is not None:
# Do some task
p.map_async(action_fn, [temp_iterables])
如果队列中有100条消息,在这里会发生什么? python将创建100个进程吗?还是在任何时候仅会处理两条消息?另外,在这种情况下,完成任务后杀死进程并在出现新消息时重新创建进程的方式是什么?
答案 0 :(得分:0)
Pool of Workers是一种设计模式,旨在将服务逻辑与业务逻辑分开。
服务逻辑旨在支持支持给定任务的所有逻辑,例如数据存储和检索,度量,日志记录和错误处理。
业务逻辑是指完成“实际工作”的组件,例如丰富或转换数据,生成统计信息等。
通常采用Publisher/Subscriber设计模式来实现,其中一个或多个工作人员侦听从服务端提供的工作队列。
大多数Pool实现要求用户在声明工人时设置其静态数量。一些更高级的工具允许动态更改工人数量。
可以以非阻塞(异步)方式调度作业,从而允许服务继续其执行流程,或者以阻塞(同步)模式停止执行,直到结果准备就绪为止。
在您的特定示例中,您声明了一个有2个工作人员的池。假设您正在使用multiprocessing.Pool
类,则解释器将启动2个进程,这些进程将等待新作业。当您调用map_async
时,可迭代对象被分成多个块,并排入Pool内部队列中。工作人员将按照到达的顺序选择大块,对它们运行action_fn
函数,并将结果发布到第二个结果队列中,该结果队列将被服务使用。
多次调用map_async
导致更多卡盘被附加到内部队列中。实际上,队列的大小是无限的。实际上,如果您设法将其填满,则随后对map_async
的调用将阻塞,直到工人为要排队的新工作腾出更多空间为止。
您不需要“杀死完成的过程”,因为Pool以透明的方式为您管理工作流程。具体来说,这个过程永远不会消亡。它只是从队列中选择下一个任务并执行它,直到没有更多可用任务为止。此时,它将进入睡眠状态,直到未计划新任务或终止池本身为止。