如何使用 celery 守护进程调用 celery 任务

Posted

技术标签:

【中文标题】如何使用 celery 守护进程调用 celery 任务【英文标题】:How to invoke celery task using celery daemon 【发布时间】:2016-03-31 08:09:35 【问题描述】:

我已经在我的 django 应用程序目录 myapp 下的 tasks.py 文件中编写了这个任务。

#periodic task that run every minute
@periodic_task(run_every=(crontab(hour="*", minute="*", day_of_week="*")))
def news():
    '''
    Grab url
    '''
    logger.info("Start task")
    now =  datetime.now()
    urls = []
    urls.append(crawler()) #crawler return dic obj
    for url_dic in list(reversed(urls)):
        for title, url  in url_dict.items():
            #Save all the scrape url in database
            Url.objects.create(title=headline, url=url)

    logger.info("Task finished: result = %s" %url)

此任务的主要目标是每分钟将 url 和标题推送到 django 数据库

要运行这个 celery 任务,我们需要使用 django ./manage 实用程序调用这些命令,如何将这些命令作为守护进程运行,我计划在 heroku 中托管这个应用程序

python manage.py celeryd --verbosity=2 --loglevel=DEBUG
python manage.py celerybeat --verbosity=2 --loglevel=DEBUG

但是我需要在后台将这两个命令命令作为守护进程运行,我们如何将这些命令作为守护进程运行,以便我的 celery 任务可以运行。

【问题讨论】:

【参考方案1】:

一个快速的解决方法是在你的命令之后加上“&”,即

python manage.py celeryd --verbosity=2 --loglevel=DEBUG &
python manage.py celerybeat --verbosity=2 --loglevel=DEBUG &

点击回车后,此任务将充当守护进程,仍会打印出有用的调试信息。因此,这对于初始阶段以及有时不严重依赖 celery 的小型应用程序来说非常有用。

出于开发目的,我建议使用supervisor。参见THIS POST,它为 celery、django 和主管集成提供了非常好的信息。阅读文章的“将 Celery 工作者作为守护进程运行”部分。

【讨论】:

以上是关于如何使用 celery 守护进程调用 celery 任务的主要内容,如果未能解决你的问题,请参考以下文章

Django celery 和 celery-beat 守护进程脚本错误

celery: 守护进程不允许有子进程

为啥 Celery 守护进程看不到任务?

Centos7 使用 Supervisor 守护进程 Celery

在 Elastic Beanstalk 上使用 Supervisor 和 Django 将 Celery 作为守护进程运行

使用 AWS Elastic Beanstalk for python 3.6 在后台运行 celery worker 作为守护进程?