繁体   English   中英

是multiprocessing.Pool充分利用了我的所有流程?

[英]is multiprocessing.Pool making use of all my processes?

我的代码获得事件通知,并且我曾经在获得事件后立即对其进行处理。 之前是单线程的,但是事件通知处理它们的速度非常快。 我将代码更改为使用Pool进行多处理。 这就是我所做的

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

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

  • 如何通过使用所有四个过程来测试事件是否得到处理? 我在每个星期日都启动调度程序,星期一很好,在星期二仍然可以看到星期一的事件正在处理,在星期三,许多星期二的事件在星期三得到处理,以此类推...

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

我的基本要求是

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

请您能帮我解决一下问题吗?

Pool.apply将事件放入池的队列中,抓取该go(event)的第一个空闲进程将执行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 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM