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