Django-Channels AsyncConsumer 不工作

Django-Channels AsyncConsumer not working

使用 SyncConsumer 和下面的代码可以正常工作

class BackgroundTaskConsumer(SyncConsumer):
    def create_users(self, message):
        number = message['number']
        id = message['id']
        UserFactory.create_batch(number, groups=(id,))

但是当使用 AsyncConsumer 和下面的代码时停止工作

class BackgroundTaskConsumer(AsyncConsumer):
    async def create_users(self, message):
        number = message['number']
        id = message['id']
        await UserFactory.create_batch(number, groups=(id,))

您需要在 database_sync_to_async 中扭曲数据库操作。

class BackgroundTaskConsumer(AsyncConsumer):
    async def create_users(self, message):
        number = message['number']
        id = message['id']
        await database_sync_to_async(UserFactory.create_batch)(number, groups=(id,))

你的使用方式似乎有点奇怪database_sync_to_async

以这种方式包装调用的函数的原因是确保它在调用之前被包装。

在 python 如果你这样做

a = c(b())

b()c(..) 之前调用。

但是 database_sync_to_async 需要做一些事情之前和之后你访问数据库。

通常在 python 中,您会使用 with contextManager 来执行此操作,但这与从 async 转换为 sync 不兼容。

所以通过 wrapping 你的 UserFactory.create_batch 方法然后 returns 一个你可以用 create_batch 调用的新方法。这与 @decorator

的工作原理相同