- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序,其中有 2 个子进程(RabbitMQ 消费者
和 RabbitMQ 生产者
)一直在运行(大部分时间它们处于空闲状态)。但我还需要根据 RabbitMQ 消费者
进程的条件生成另一个 N
数量的子进程(我们称之为 Worker process
)。
所以 Worker processes
非常轻量级,不会做很多计算,但是他们做的工作需要很长时间(最多一个小时)。机器本身不会超过 4 个 CPU 内核。我计划在 CentOS
上运行该应用程序。所以问题是:有很多(我预计从 1 到 20 个)这样的轻量级进程来来去去,而且大部分时间都是空闲的,这是否可以?
我的第一个想法是创建一个子进程(Worker process
),然后在内部使用线程。但我听说有人很难将 multiprocessing
和 threading
模块混合在一起。是真的吗?
顺便说一下,我的应用程序是在 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/
我正在阅读 MongoDB,并试图了解它的最佳用途。我没有看到明确答案的一个问题是哪些操作便宜或昂贵,以及在什么条件下。 你能帮忙澄清一下吗? 谢谢。 最佳答案 人们经常声称 mongodb 的写入速
我正在寻找一个主要来源(或一个非常好的解释)来支持在为 iPhone 编写软件时使用 autorelease 是危险的或过于昂贵的说法。 许多开发者都提出了这种说法,我什至听说 Apple 不推荐它,
我意识到这离微优化领域太远了,但我很想知道为什么调用 DateTime.Now 和 DateTime.UtcNow 如此“昂贵”。我有一个示例程序,它运行几个场景来做一些“工作”(添加到一个计数器)并
我是一名优秀的程序员,十分优秀!