我有一个 HTTP 服务器,它执行一些 IO 操作,然后执行一些 CPU 绑定(bind)操作 (PIL),然后回复数据(兆字节左右)。
(a) 我的第一个想法是这样的:一个用于服务器和 IO 的进程,基于 Twisted,以及多个用于 PIL 东西的进程,带有队列。
如果这个架构是合理的,那么可能有一个库可以做到这一点:Twisted 的多进程队列。但是,我在 Twisted 方面并没有真正的经验并且对它的社区一无所知,所以我唯一找到的是 ampoule
,我没有找到任何文档和描述来说服我它是正确的工具一份工作。
(b) 另一个想法是在多个线程中运行多个服务器,每个线程中都包含 IO 和 CPU 的东西。这看起来很愚蠢,因为 CPU 的东西会阻塞,但也许我并不真正理解它。
那么,问题:
- 这些架构是否合理?
- 你将如何实现它(使用
Twisted
+ampoule
或什么?) - 对于 (a),您如何将大量数据从“worker”发送到服务器线程?或者我可以告诉工作人员以某种方式直接写入响应?
- 多少“ worker ”是合理的?
最佳答案
- 是的,这些架构可能是合理的
- 我可能也会使用安瓶,但我现在也不太了解它。 This link是我记得见过的最接近好的介绍的东西。
- 既然听起来您的工作人员总是在同一台机器上,您应该能够使用共享内存。
- 这在很大程度上取决于可用内核的数量以及工作的密集程度(包括 CPU 时间和其他资源,如内存和磁盘)。可能很难给出比“每个核心大约 1-5 个进程的基准测试,看看什么是最快的”更好的答案。
关于python - Twisted 队列用于 CPU 密集型任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11385131/