【问题标题】:Run celery worker and celery beat as thread运行 celery worker 和 celery beat 作为线程
【发布时间】:2023-11-20 05:48:01
【问题描述】:

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

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

【问题讨论】:

    标签: python celery celerybeat


    【解决方案1】:

    您可以使用app.worker_main() 将工作线程作为线程运行。

    由于您能够从命令行运行它,我假设您已经为Celery 类构建了一个对象(在文档中通常称为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类中

    def beat_main(self, argv=None):
        return instantiate(
            'celery.bin.beat:beat',
            app=self).execute_from_commandline(argv)
    

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

    【讨论】:

      最近更新 更多