celery beat - 如何 运行 用户列表的多个任务?

celery beat - how to run multiple tasks for list of users?

我有三个任务需要为 100 多个用户执行。 示例用户 lsit:

['user1', 'user2', 'user3','user4', 'user5', 'user6']

这里是 celery beat 的代码片段:

for user in users:
    APP.conf.beat_schedule = {
        "trigger-sync_books": {
            "task": "call_sync_books",
            "schedule": crontab(minute=0, hour="*/24"),
            'args': (user, bo, gg,),
        },
        "trigger-sync_stock": {
            "task": "call_sync_stock",
            "schedule": crontab(minute="*/10"),
            'args': (user, bo, gg,),
        },
        "trigger-sync_customer": {
            "task": "call_sync_customer",
            "schedule": crontab(minute=0, hour="*/24"),
            'args': (user, bo, gg,),
        },
    }

但是每次 celery beat 都会为列表中的最后一个用户发送这三个任务。 即,示例列表中的 user6

如何确保为所有用户执行这三个任务?

这行不通。您要重新定义 APP.conf.beat_schedule 的次数与您拥有用户的次数一样多,因此基本上所有之前的 5 个配置都会被该循环中的最后一个配置覆盖。

尝试以下操作:

for user in users:
    us_sched = {
        f"trigger-sync_books-{user}": {
            "task": "call_sync_books",
            "schedule": crontab(minute=0, hour="*/24"),
            'args': (user, bo, gg,),
        },
        f"trigger-sync_stock-{user}": {
            "task": "call_sync_stock",
            "schedule": crontab(minute="*/10"),
            'args': (user, bo, gg,),
        },
        f"trigger-sync_customer-{user}": {
            "task": "call_sync_customer",
            "schedule": crontab(minute=0, hour="*/24"),
            'args': (user, bo, gg,),
        }
    }
    # Python >= 3.5:
    APP.conf.beat_schedule = {**APP.conf.beat_schedule, **us_sched}
    # Python 3.9: APP.conf.beat_schedule |= us_sched

当上面的循环结束时,您将在 APP.conf.beat_schedule 字典中获得所有用户的所有计划。