用芹菜运行另一个定期任务中的任务

时间:2020-10-22 13:25:59

标签: python celery

我有定期任务,应该触发另一个任务。最终的预期行为:第一个任务应该从外部服务收集一些数据,然后遍历此数据(列表),并通过传递参数调用另一个任务(当前迭代在循环中)。我希望循环中的那些任务是异步的。

我编写的代码定期运行一个任务,但是我不知道该任务应如何调用另一个任务,因为当我通过.delay()方法执行该任务时,什么也没发生。

这是我要运行的一些简化代码:

@celery_app.task(name="Hello World")
def hello_world():
    print(f"HELLO WORLD PRINT")
    add.delay(2, 2)
    return 'Hello'


@celery_app.task
def add(x, y):
    with open(f"./{str(datetime.datetime.now())}.txt", 'w') as file:
        file.write(str(x+y))
    print(f"x + y = {x + y}")
    return x + y

目前hello_world()每30秒运行一次,结果我在日志中收到HELLO WORLD PRINT,但添加任务未运行。我看不到该任务应创建的打印文件或文件。

更新评论,这是我使用队列的方式:

celery_app.conf.task_routes = {
    "project.app.hello_world": {
        "queue": 'test_queue'
    },
    "project.app.add": {
        "queue": 'test_queue'
    },

1 个答案:

答案 0 :(得分:1)

解决问题的方法很少。

一个明显的方法是将队列名称放入.apply_async中,例如add.apply_async(10, 10, queue="test_queue")

另一种解决方案是将队列放入任务注释,即@celery_app.task(queue="test_queue")

我从未配置task_routes,但是我相信可以像您尝试的那样在其中指定它。