如何昂贵的是有很多的过程,通过多处理模块催生?

Vor*_*Vor 2 python multithreading centos multiprocessing

我有一个应用程序,我有2子过程(RabbitMQ consumerRabbitMQ producer正在不断磨合)(大多数时候他们空闲的时间).但我也需要生成另一个N子进程数(让我们称之为它Worker process基于的条件)RabbitMQ consumer的过程.

因此Worker processes非常轻量级并且不需要进行大量计算,但是工作确实需要很长时间(长达一个小时).机器本身不会有超过4个CPU内核.我打算运行应用程序CentOS.所以问题是:可以有很多(我希望从1到20)像这样的轻量级流程来来去去,大部分时间都会闲置吗?

我的第一个想法是创建一个子进程(Worker process)而不是使用内部的线程.但是我听说过混音multiprocessingthreading模块混合困难的人.这是真的吗?

顺便说一句,我的应用程序是在Python 2.7中,并产生我使用multiprocessing模块的子进程.

Cal*_*ngh 6

根据您的描述,我建议您应该继续为您的约20个工作创建多个流程.该multiprocessingAPI使这很容易,和你最宝贵的资源是你自己的时间.并发编程的复杂性可能会很快失控,因此您需要获得所有帮助.

细节

如果您的工作进程受I/O限制,那么(可以说)对于拥有许多进程没有CPU影响.我的Windows目前列出了145个正在运行的进程,但我们认为该计算机处于空闲状态.只需确保您的代码time.sleep(x)定期调用,x轮询的"合理"暂停时间,或者您正在使用为您执行此操作的库,例如多处理的连接对象及其.poll(x)方法.

如果您的工作进程受CPU限制,那么我担心您最好设置一个大小等于您的空闲CPU的进程池,然后将作业推送到队列并让池中的进程从队列中取出作业. multiprocessing很好地支持这种范式.

当工作者在不同时间受到CPU绑定和I/O限制时,它会变得棘手.在这种情况下,我建议您保留一个进程保留(专用)CPU工作,让它从队列中取出作业,然后让许多其他(I/O)进程创建作业并将它们推送到工作队列.如果工作速度超过一个CPU核心可以处理的速度,则可以添加第二个专用核心,或者在队列上设置maxsize,让I/O工作人员监视队列大小以了解是否可以添加新工作.

如果你有许多I/O绑定的工作者,那么你必须开始查看基于事件的框架,如asyncio,Twisted,gevent,eventlet,greenlet等.这是因为生成的每个OS线程或进程都有一个预留内存开销,一旦进入数千个实例,预留空间开始累加; 另一方面,基于事件的系统不会产生多个线程,它们只是遍历I/O设备接口并根据事件累积数据.您可以通过基于事件的网络支持大量并发连接.

在Windows中,有多个线程和进程的测量极限的优秀文章在这里.对文档的快速扫描告诉我,对于最大进程数,发现了~10k的限制.我已经在其他地方看到过这个10k问题,但我现在没有可用的参考资料.

如果你有很多受CPU限制的工作者,那么你必须使用分布式计算,将工作推送到各种不同的机器上. multiprocessing通过ManagerAPI 支持这一点,但我没有这方面的个人经验.ZeroMQ目前似乎很受欢迎,用于处理分布式消息传递.