与 Eventlet 并发 — Python 文档

来自菜鸟教程
Celery/docs/latest/userguide/concurrency/eventlet
跳转至:导航、​搜索

与 Eventlet 的并发

简介

Eventlet 主页将其描述为 Python 的并发网络库,它允许您更改代码的运行方式,而不是编写代码的方式。

  • 它使用 epoll(4)libevent 来实现 高度可扩展的非阻塞 I/O
  • Coroutines 确保开发人员使用类似于线程的阻塞式编程风格,但提供非阻塞 I/O 的好处。
  • 事件分派是隐式的:这意味着您可以轻松地从 Python 解释器中使用 Eventlet,或者作为较大应用程序的一小部分。


Celery 支持 Eventlet 作为替代的执行池实现,并且在某些情况下优于 prefork。 但是,您需要确保一项任务不会长时间阻塞事件循环。 通常,CPU 密集型操作不适用于 Eventlet。 另请注意,某些库(通常带有 C 扩展名)无法进行猴子修补,因此无法从使用 Eventlet 中受益。 如果您不确定,请参阅他们的文档。 例如,pylibmc 不允许与 Eventlet 合作,但当它们都是具有 C 扩展的库时,psycopg2 允许。

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


启用 Eventlet

您可以使用 celery worker -P 工作器选项启用 Eventlet 池。

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

例子

有关使用 Eventlet 支持的一些示例,请参阅 Celery 发行版中的 Eventlet 示例 目录。