方案
我有一个用Python和gevent实现的服务器进程,它通过TCP / IP连接到后端服务,并根据后端服务提供的更改,为快速变化的动态内容提供服务的许多Web客户端(每个进程大约1000个) 。该服务在Ubuntu 10.04上运行,不能在Windows上运行,因此目标平台是固定的。我们目前正在使用Python 2.6.6。
问题
为多个客户端提供更改可能会导致处理后端发送的更改滞后,因此我的计划是将服务器拆分为多个进程。许多工作进程将为Web客户端提供服务,而主进程仍将连接到后端服务。我已经使用了一个单独的greenlet池来为Web客户端提供服务,但是它们需要被放入工作进程中。
问题
请您指点一下gevent的工作流程池实现,或者弄清楚如何以正确的方式使用Python自己的多处理模块?
限制
我想避免在我们的进程中引入Python线程,因为这会为GIL争用提供空间,这会通过引入延迟来降低性能。因此,如果可能的话,它将是一个干净的多处理+ gevent解决方案。
答案 0 :(得分:2)
我会考虑自定义套接字IPC或使用ZeroMQ。
答案 1 :(得分:1)
我建议看看Celery - 用Python编写的分布式任务处理系统。
celery
的基本思想是你有一个队列(RabbitMQ
或Redis
),工作者编写为Python进程,并通过celeryd
守护进程公开。根据celery文档,celeryd
也支持在gevent
模式下运行(对于网络I / O绑定进程),因此可能在您的工作代码中不需要进行太多修改即可在此环境中运行。