python - 运行 celery worker 和 celery 节拍作为线程

标签 python celery celerybeat

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

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

最佳答案

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

由于您能够从命令行运行它,我假设您已经为 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 带参数)。希望它也适用于您。

关于python - 运行 celery worker 和 celery 节拍作为线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37388102/

相关文章:

python - 以编程方式在 Python 中创建带有下拉单元格的 XLS

python - Jinja 模板中的嵌套打印语句

python - 使用可变参数在django模板中循环

python 不使用更新的 pip scipy 包

django - 如何使用 celery 和 Django 以编程方式生成 celerybeat 条目

django - 由于errno 104, celery 操作不佳

python - 在一个线程中创建的 DatabaseWrapper 对象只能在同一个线程中使用。”尝试使用 celery 插入数据库时

python - Celery:如何为基于类的任务创建签名?

linux - 如何检测失败并自动重启 celery worker

python - Django Celery 结果将任务 ID 设置为人类可读的内容?