我正在开发一个使用芹菜和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
实际上在任务功能中不起作用。我想念什么吗?
答案 0 :(得分:1)
您所谈论的问题是有理由设计的。它也是well-documented,可以使用适当的Canvas轻松解决。
也...不要与术语混淆... Celery 是异步的,但是它不是“ Python async”,因为它早于Python的异步...也许Celery 5会得到它的异步部件已替换/重构为使用Python 3+ asyncio及其相关版本。