【发布时间】:2012-10-23 01:02:14
【问题描述】:
我想将 Celery 用作我的任务队列,这样我的网络应用程序就可以将任务排入队列,返回响应,并且该任务将同时处理/某天/...我构建了一种 API,所以我提前不知道会有什么样的任务——未来可能会有处理HTTP请求的任务,另一个IO,也有CPU消耗的任务。在这方面,我想在进程上运行 Celery 的工作人员,因为这些是 Python 中通用的并行性。
但是,我也想在我的任务中使用 gevent,所以我可以让一个任务产生许多 HTTP 请求等。问题是,当我这样做时:
from gevent import monkey
monkey.patch_all()
芹菜停止工作。它开始了,但没有任务可以有效地排队——它们似乎去代理,但芹菜工人没有收集和处理它们。只能启动和等待。如果我删除这些行并在没有任何 gevent 和并行化的情况下执行任务,那么一切正常。
我认为这可能是因为 gevent 补丁也线程化。所以我尝试了
from gevent import monkey
monkey.patch_all(thread=False)
...但是 Celery 甚至没有启动,它在没有给出原因的情况下崩溃(打开了调试级别的日志记录)。
是否可以使用 Celery 将任务排入队列并使用 gevent 在单个任务中做一些事情?如何?我做错了什么?
【问题讨论】:
-
gevent.monkey.patch_all() github.com/kennethreitz/grequests/issues/8可能存在一些问题
-
当然可以。不幸的是,必须运行这样的语句才能将 gevent 与套接字等一起使用。
-
你是在启动绿色线程后启动事件循环吗?例如:
gevent.joinall()我认为最大的问题是事后清理。 AFAIK 你不能暂时打补丁,这个过程必须永远打补丁。 -
是的,我首先创建了greenlets,然后使用了
gevent.joinall()。
标签: python multiprocessing celery gevent monkeypatching