与 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