并发with Eventlet

Introduction

Eventletopen in new window主页将其描述为Python的并发网络库,可让改变你执行代码的方式,而非编写代码的方式。

Celery 支持 Eventlet 作为替代执行池实现,并且在某些情况下优于 prefork。 但是,您需要确保一项任务不会阻塞事件循环太久。 通常,受 CPU 限制的操作在 Eventlet 中并不顺利。 另请注意,某些库(通常具有 C 扩展名)无法进行猴子补丁(monkeypatched),因此无法从使用 Eventlet 中受益。 如果您不确定,请参阅他们的文档。 例如,pylibmc 不允许与 Eventlet 合作,但是具有同样 C 扩展的psycopg2库可以。

prefork 池可以使用多个进程,但通常受限于每个CPU运行几个。 使用 Eventlet,您可以有效地生成数百或数千个绿色线程。 在使用 feed hub 系统进行的非正式测试中,Eventlet 池每秒可以获取和处理数百个 feed,而 prefork 池花费 14 秒处理 100 个 feed。 请注意,这是异步 I/O 特别擅长的应用之一(异步 HTTP 请求)。 您可能想要混合使用 Eventlet 和 prefork 工作程序,并根据兼容性或最有效的方式路由任务。

Enabling Eventlet

使用celery worker -Popen in new window选项可以开启Eventlet pool支持。

$ celery -A proj worker -P eventlet -c 1000

Examples

Celery发行版的Eventlet examplesopen in new window目录中有一些使用Eventlet支持的任务示例。