运行 celery worker 和 celery beat 作为线程

use*_*902 3 python celery celerybeat

我正在使用芹菜来执行一些时间触发的任务。使用普通的命令行方法,我可以轻松生成任务并执行它们。为此,我必须创建两个守护进程,一个用于 celery beat,另一个用于 celery worker。

现在虽然 celery 确实解决了我创建和执行时间触发任务的问题,但它的代价是为我的系统增加了两个额外的守护进程。我已经为我的模块运行了一个守护进程,我想重用它(添加 celery worker 并作为线程击败现有模块)。有没有办法这样做?

aki*_*pro 6

您可以使用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)
Run Code Online (Sandbox Code Playgroud)

只需在模块的 main.py 文件中为上述方法创建一个线程。

对于 celery beat,我之前曾尝试自己构建类似的方法。(不确定是否已经存在方法)。我编写了以下方法并将其添加到 Celery 类中

def beat_main(self, argv=None):
    return instantiate(
        'celery.bin.beat:beat',
        app=self).execute_from_commandline(argv)
Run Code Online (Sandbox Code Playgroud)

你的 Celery 类是用/usr/local/lib/python2.7/dist-packages/celery/app/base.py. 尝试以与工人相同的方式使用它(app.beat_main带参数)。希望它也适用于您。