Вы заполняете очередь из потока, отличного от того, который запускает событие l oop. По дизайну очереди asyncio не потокобезопасны и могут быть безопасно доступны только из сопрограмм asyncio и обратных вызовов.
Вы можете исправить проблему, изменив свой вызов на queue.put_nowait(elem)
, на что-то например, loop.call_soon_threadsafe(queue.put_nowait, elem)
, где loop
- это объект события l oop, который вы также должны передать потоку, вероятно, так же, как вы передаете очередь.
зачем тогда раскомментированная часть кода исправить проблему?
Раскомментирование эффективно устраняет необходимость пробуждения сопрограммы во время ожидания в пустой очереди. Пробуждение не сработало, потому что put_nowait
предполагает, что оно запускается из потока события l oop, и, следовательно, не нужно испускать дополнительный сигнал пробуждения. См., Например, этот ответ для подробностей.