我正在使用芹菜来执行一些时间触发的任务。使用普通的命令行方法,我可以轻松生成任务并执行它们。为此,我必须创建两个守护进程,一个用于芹菜节拍,另一个用于芹菜工人。
现在,虽然芹菜确实解决了我创建和执行时间触发任务的问题,但它是以我的系统增加两个守护进程为代价的。我已经为我的模块运行了一个守护程序,我想重用它(添加芹菜工人并将 beat 作为线程添加到现有模块)。有没有办法这样做?
app.worker_main()
将工作线程作为线程运行。
由于您能够从命令行运行它,因此我假设您已经为 Celery
类构建了一个对象(通常在文档中称为 app
)。可以尝试使用以下代码将辅助角色作为线程运行。
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 即可。
对于芹菜节拍,我之前曾尝试过自己构建类似的方法。(不确定是否已经存在方法)。我编写了以下方法并将其添加到芹菜类中
def beat_main(self, argv=None):
return instantiate(
'celery.bin.beat:beat',
app=self).execute_from_commandline(argv)
你的芹菜课是用/usr/local/lib/python2.7/dist-packages/celery/app/base.py
写的。尝试以与工作线程相同的方式使用它(app.beat_main
带有参数)。希望它也适合您。