运行 celery worker 和 celery beat as thread
Run celery worker and celery beat as thread
我正在使用芹菜来执行一些时间触发的任务。使用普通的命令行方法,我可以轻松地生成任务并执行它们。为此,我必须创建两个守护进程,一个用于 celery beat,另一个用于 celery worker。
现在虽然 celery 确实解决了我创建和执行时间触发任务的问题,但它是以我的系统的两个额外守护进程为代价的。我的模块已经有一个守护进程 运行,我想重用它(将 celery worker 和 beat 作为线程添加到现有模块)。有办法吗?
您可以使用 app.worker_main()
将工作线程 运行 作为线程。
因为您可以从命令行 运行 它,我假设您已经为 Celery
class(通常称为 app
文档)。你可以试试下面的代码运行 worker 作为一个线程。
from celeryconfig import app # config file you must have build earlier where app = Celery(), object of Celery class
def worker():
# Arguments you give on command line
argv = [
'worker','-A','<module>.tasks',
'-P','gevent', # Would probably need this argument if running with other Greenlets
'--loglevel=info']
app.worker_main(argv)
只需在模块的 main.py 文件中为上述方法创建一个线程即可。
对于celery beat,我之前曾尝试自己构建一个类似的方法。 (不确定是否已经存在一种方法)。我写了下面的方法并添加到Celery class
def beat_main(self, argv=None):
return instantiate(
'celery.bin.beat:beat',
app=self).execute_from_commandline(argv)
你的 Celery class 写在 /usr/local/lib/python2.7/dist-packages/celery/app/base.py
中。尝试以与 worker 相同的方式使用它(app.beat_main
带参数)。希望它也对你有用。
我正在使用芹菜来执行一些时间触发的任务。使用普通的命令行方法,我可以轻松地生成任务并执行它们。为此,我必须创建两个守护进程,一个用于 celery beat,另一个用于 celery worker。
现在虽然 celery 确实解决了我创建和执行时间触发任务的问题,但它是以我的系统的两个额外守护进程为代价的。我的模块已经有一个守护进程 运行,我想重用它(将 celery worker 和 beat 作为线程添加到现有模块)。有办法吗?
您可以使用 app.worker_main()
将工作线程 运行 作为线程。
因为您可以从命令行 运行 它,我假设您已经为 Celery
class(通常称为 app
文档)。你可以试试下面的代码运行 worker 作为一个线程。
from celeryconfig import app # config file you must have build earlier where app = Celery(), object of Celery class
def worker():
# Arguments you give on command line
argv = [
'worker','-A','<module>.tasks',
'-P','gevent', # Would probably need this argument if running with other Greenlets
'--loglevel=info']
app.worker_main(argv)
只需在模块的 main.py 文件中为上述方法创建一个线程即可。
对于celery beat,我之前曾尝试自己构建一个类似的方法。 (不确定是否已经存在一种方法)。我写了下面的方法并添加到Celery class
def beat_main(self, argv=None):
return instantiate(
'celery.bin.beat:beat',
app=self).execute_from_commandline(argv)
你的 Celery class 写在 /usr/local/lib/python2.7/dist-packages/celery/app/base.py
中。尝试以与 worker 相同的方式使用它(app.beat_main
带参数)。希望它也对你有用。