芹菜真的不同步吗?

时间:2019-08-12 15:16:36

标签: python-3.x asynchronous celery django-celery django-channels

我正在开发一个使用芹菜和Django频道的实时游戏。

我有一个工作类似于计时器的任务,如果该计时器达到零,则一旦激活该任务,就会调用group_send()。从我看来,芹菜任务是异步的,但我们无法等待任务中的函数..这使我有些困惑..这是代码:

@app.task(ignore_result=True)
def count_down(channel_name):
    set_random_game_result(channel_name)
    room = process_game_result(channel_name, revoke=False)
    channel_layer = get_channel_layer()
    async_to_sync(channel_layer.group_send)(
        channel_name,
        {
            "type": "game_room_info",
            "room": room
        }
    )

来自文档:

  

默认情况下,send(),group_send(),group_add()和其他函数是异步函数,这意味着您必须等待它们。如果您需要从同步代码中调用它们,则需要使用方便的asgiref.sync.async_to_sync包装器

所以,如果celery是异步的,为什么不使用async_to_sync实用程序就不能使用group_send?

另一件事是关于查询。.来自文档:

  

但是,如果要编写异步代码,则需要使用database_sync_to_async在安全,同步的上下文中调用数据库方法。

database_sync_to_async实际上在任务功能中不起作用。我想念什么吗?

1 个答案:

答案 0 :(得分:1)

您所谈论的问题是有理由设计的。它也是well-documented,可以使用适当的Canvas轻松解决。

也...不要与术语混淆... Celery 异步的,但是它不是“ Python async”,因为它早于Python的异步...也许Celery 5会得到它的异步部件已替换/重构为使用Python 3+ asyncio及其相关版本。