gpt4 book ai didi

python - 由多处理模块产生的大量进程有多昂贵?

转载 作者:行者123 更新时间:2023-11-28 21:22:21 25 4
gpt4 key购买 nike

我有一个应用程序,其中有 2 个子进程(RabbitMQ 消费者RabbitMQ 生产者)一直在运行(大部分时间它们处于空闲状态)。但我还需要根据 RabbitMQ 消费者 进程的条件生成另一个 N 数量的子进程(我们称之为 Worker process)。

所以 Worker processes 非常轻量级,不会做很多计算,但是他们做的工作需要很长时间(最多一个小时)。机器本身不会超过 4 个 CPU 内核。我计划在 CentOS 上运行该应用程序。所以问题是:有很多(我预计从 1 到 20 个)这样的轻量级进程来来去去,而且大部分时间都是空闲的,这是否可以?

我的第一个想法是创建一个子进程(Worker process),然后在内部使用线程。但我听说有人很难将 multiprocessingthreading 模块混合在一起。是真的吗?

顺便说一下,我的应用程序是在 Python 2.7 中运行的,为了生成子进程,我使用了 multiprocessing 模块。

最佳答案

根据您的描述,我建议您继续为大约 20 个作业创建多个流程。 multiprocessing API 使这变得非常简单,您最宝贵的资源就是您自己的时间。并发编程的复杂性可能很快就会失控,因此您需要获得所有可能的帮助。

详情

如果您的工作进程I/O 受限,那么(可以说)拥有多个进程不会对 CPU 产生影响。我的 Windows 当前列出了 145 个正在运行的进程,但我们认为机器处于空闲状态。只需确保 您的 代码定期调用 time.sleep(x),其中 x 是轮询的“合理”暂停时间,或者你正在使用一个为你做这件事的库,比如 multiprocessing 的连接对象及其 .poll(x) 方法。

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

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

如果您有大量受 I/O 限制的 worker,那么您必须开始考虑基于事件的框架,例如 asyncio , Twisted , gevent , eventlet , greenlet等等。这是因为每个 OS 线程或进程都有预留内存成本,一旦你进入数千个实例,预留空间就会开始增加;另一方面,基于事件的系统不会生成多个线程,它们只是在 I/O 设备接口(interface)上循环并根据事件累积数据。您可以使用基于事件的网络支持大量并发连接。

在Windows上,有一篇关于多线程和进程的实测限制的优秀文章here .快速扫描文档告诉我发现最大进程数的限制为 ~10k。我在其他地方看到过这个被称为10k 问题,但我现在没有可用的引用。

如果您有大量受 CPU 限制的工作人员,那么您必须使用分布式计算,将作业推送到各种不同的机器。 multiprocessing 也通过 Manager API 支持这一点,但我没有这方面的个人经验。 ZeroMQ 现在似乎很流行用于处理分布式消息传递。

关于python - 由多处理模块产生的大量进程有多昂贵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19299908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com