是多处理.Pool利用我的所有流程?

时间:2015-01-12 09:29:24

标签: python python-3.x multiprocessing multiprocess python-multiprocessing

我的代码获取事件通知,我过去就会处理事件。之前它是单线程的,但事件通知处理起来非常快。我改变了我的代码以使用Pool进行多处理。这就是我做的事情

  • 创建了Pool = multiprocessing.pool(processes=4)(我可以处理最多11个核心)
  • 将事件添加到池中以进行异步 - pool.apply_async(go, ["event-1"])

这就是我所做的一切。以简单的方式,我将向池和池中添加事件将由4个进程处理。现在我的问题是。

  • 如何通过利用所有4个流程来测试我的事件?我每周日开始我的日程安排,星期一很好,星期二我仍然看到星期一的事件被处理,星期三这个数字增长很多星期二的事件在周三处理等等......

我基本上是Java家伙,我发现很难发现python如何在内部处理我的事件。我可以简单地增加流程,但我不确定这是否有帮助?

我的基本要求是

  • 我为自己注册活动,并希望处理每个活动
  • 我想在单独的进程中处理事件,因此主进程/线程仍然继续侦听新事件
  • 我并不担心已处理事件的结果。 (但pool.apply_async(func1,["event1"])返回值)

请你能帮助我填写一些想法吗?

1 个答案:

答案 0 :(得分:2)

Pool.apply将事件放在池的队列中,第一个获取它的免费进程将执行go(event)

一种简单的方法来确定哪个进程正在执行什么操作,以便为go函数添加一些日志记录。

import logging
import os

def go(event):
    logging.info("process: %d, event: %r", os.getpid, event)
    #do actual processing

池中需要多少个进程取决于您拥有的工作负载类型。如果您的作业CPU很重,那么大于核心数的工作池将无济于事。但是,如果您的瓶颈是IO,您可能会受益于更多的工作人员,您应该考虑切换到线程(请参阅multiprocessing.pool.ThreadPool)。