2

设想

我有一个用 Python 和 gevent 实现的服务器进程,它通过 TCP/IP 连接到后端服务,并根据后端服务提供的更改为许多 Web 客户端(每个进程约 1000 个)提供快速变化的动态内容。该服务在 Ubuntu 10.04 上运行,不会在 Windows 上运行,因此目标平台是固定的。我们目前使用的是 Python 2.6.6。

问题

为这么多客户端提供更改可能会导致处理后端发送的更改时出现延迟,因此我的计划是将服务器拆分为多个进程。许多工作进程将为 Web 客户端提供服务,而主进程仍将连接到后端服务。我已经在使用一个单独的 greenlets 池来为 Web 客户端提供服务,但它们需要放入工作进程中。

问题

您能否为我指出一个用于 gevent 的工作进程池实现,或者弄清楚如何以正确的方式将 Python 自己的多处理模块与 gevent 一起使用?

限制

我想避免在我们的进程中引入 Python 线程,因为这会给 GIL 争用留出空间,这会通过引入延迟来降低性能。因此,如果可能的话,这将是一个干净的多处理 + gevent 解决方案。

4

2 回答 2

2

我会考虑自定义套接字 IPC 或使用 ZeroMQ。

于 2011-07-12T21:07:53.793 回答
1

我建议看一下Celery - 用 Python 编写的分布式任务处理系统。

基本思想celery是你有一个队列(要么 要么RabbitMQRedis,其中工作人员编写为 Python 进程,并通过celeryd守护进程公开。根据 celery 文档,也celeryd支持在gevent模式下运行(对于网络 I/O 绑定进程),所以大概你的工作代码不需要太多修改就可以在这个环境中运行。

于 2011-03-19T10:05:07.603 回答