Django -каналы AsyncConsumer не работают - PullRequest
0 голосов
/ 20 апреля 2020

при использовании 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,))

1 Ответ

1 голос
/ 20 апреля 2020

вам нужно деформировать действия базы данных в 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

причину, по которой вы оборачиваете Функция, которую вы вызываете так, как вы делаете, заключается в том, чтобы убедиться, что она обернута перед вызовом.

in python, если вы делаете

a = c(b())

b(), вызываемый до c(..) ,

однако database_sync_to_async необходимо сделать несколько вещей до и после доступа к БД.

обычно в python вы бы используйте для этого with contextManager, но это не совместимо с преобразованием из async в sync.

, поэтому wrapping ваш UserFactory.create_batch метод возвращает затем новый метод, который вы можете звоните с create_batch. Это работает так же, как @decorator

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...