有什么方法可以使@periodic_task只在调用中运行,而在项目启动时自动运行?

时间:2018-09-16 23:02:48

标签: django celery django-celery celerybeat djcelery

有什么方法可以使periodic_task仅在通话中运行,我看到django-app Pingit()运行后,python manage.py runserver就开始运行了

@periodic_task(run_every=crontab(minute="*/1"),options={"task_id":task_name})
    def Pingit():
        print('Every Minute Im Called')

仅当我通过Pingit调用它时,我才希望它运行定期任务。

1 个答案:

答案 0 :(得分:1)

为此,您最好使用@task,并使其在执行后重新排队,例如:

@app.task
def pingit(count=0):
    if count < 60 * 24 * 7:  # 7 days in minutes
        print('Every Minute Im Called')

        # Queue a new task to run in 1 minute
        pingit.apply_async(kwargs={'count': count + 1}, countdown=60)

# Start the task manually
pingit.apply_async()

如果需要向函数添加位置参数,则可以使用args指定位置参数。例如,传递一个name参数:

@app.task
def pingit(name, count=0):
    if count < 60 * 24 * 7:  # 7 days in minutes
        print('Every Minute Im Called')

        # Queue a new task to run in 1 minute
        pingit.apply_async(args=[name], kwargs={'count': count + 1}, countdown=60)

# Start the task manually
pingit.apply_async(args=['MyName'])