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
的工作原理相同
使用 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