Почему моя очередь зависает с циклом событий asyncio

Я запускаю новый процесс (редактировать то же самое применимо к новому потоку) для вычислений из цикла асинхронных событий. У нового процесса есть собственный цикл событий asyncio, который работает нормально, без каких-либо блокировок.

Я создал две очереди (multiprocessing.Queue или multiprocessing.Manager.Queue), одну для исходящих сообщений, а другую для входящих сообщений. У меня одинаковое поведение с обеими очередями. Очередь исходящих сообщений работает нормально, так как я помещаю / получаю сообщение в очередь с помощью:

await asyncio.get_running_loop().run_in_executor(None, self.incoming_queue.put, msg)
msg = await asyncio.get_running_loop().run_in_executor(None, self.incoming_queue.get, True, 1)

Однако, когда я пытаюсь запустить ту же команду get() в моем исходном приложении asyncio с помощью команды asyncio run_in_executor, она просто зависает. Сам цикл событий кажется прекрасным и отзывчивым.

Отключение рабочей очереди ничего не меняет, как и исполнитель (по умолчанию, поток или процесс).

Идеи?


person Brian    schedule 17.10.2019    source источник
comment
Можете ли вы создать минимальный пример, который мы могли бы запустить, чтобы наблюдать такое же поведение?   -  person user4815162342    schedule 18.10.2019
comment
Продолжая отладку, я узнал, что это может быть связано с некоторой конфигурацией цикла событий в каналах Django (приложение, в которое я пытаюсь интегрироваться). Я создал более простой цикл asyncio для запуска кода, и каждая очередь, похоже, работает нормально. Я обновлю через несколько часов, если что-то изменится, и я могу удалить вопрос в это время, если у меня не будет более полезной информации.   -  person Brian    schedule 18.10.2019


Ответы (1)


Я решил дать здесь ответ на основании своего расследования. Вкратце: то, что работает в новом цикле событий в новом процессе, НЕ работает в цикле событий Django Channels по той или иной причине.

Мое текущее решение состоит в том, чтобы вручную создать новый поток для запуска моего синхронного слушателя. Я ищу варианты того, почему цикл событий каналов не будет работать в моем случае использования.

person Brian    schedule 18.10.2019