在gevent中实现工作进程池的最佳方法是什么?
场景
我有一个用Python和gevent实现的服务器程序,它通过TCP/IP连接到一个后端服务,并为大约1000个Web客户端提供快速变化的动态内容,这些内容是根据后端服务发送的变化来更新的。这个服务运行在Ubuntu 10.04上,不能在Windows上运行,所以目标平台是固定的。目前我们使用的是Python 2.6.6。
问题
为这么多客户端提供更新内容可能会导致处理后端发送的变化时出现延迟,所以我的计划是把服务器拆分成多个进程。一些工作进程将负责服务Web客户端,而主进程仍然连接到后端服务。我已经在使用一个单独的绿色线程池来服务Web客户端,但这些绿色线程需要放到工作进程中。
请求
你能帮我找到一个适用于gevent的工作进程池实现,或者告诉我如何正确地将Python自带的多进程模块与gevent结合使用吗?
限制条件
我希望避免在我们的进程中引入Python线程,因为这会导致全局解释器锁(GIL)争用,从而降低性能并引入延迟。所以如果可能的话,我希望能有一个干净的多进程加gevent的解决方案。
2 个回答
2
我建议可以考虑使用自定义的套接字进行进程间通信,或者使用ZeroMQ这个工具。
2
我建议你看看Celery——这是一个用Python写的分布式任务处理系统。
简单来说,celery
的基本概念是,你有一个队列(可以是RabbitMQ
或者Redis
),然后用Python写的工作程序(也就是处理任务的程序)在后台运行,这个后台程序叫做celeryd
。根据celery的文档,celeryd
也支持在gevent
模式下运行(这对于需要处理网络输入输出的程序很有用),所以你的工作程序在这个环境下运行时,可能不需要太多改动。