Django-Channels AsyncConsumer不起作用

问题描述 投票:0回答:1

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,))
django python-asyncio django-channels
1个回答
1
投票

您需要扭曲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方法,然后返回一个可以用create_batch调用的新方法。它的工作与@decorator

相同
© www.soinside.com 2019 - 2024. All rights reserved.