Странное поведение очереди asyncioPython

Программы на Python
Ответить
Anonymous
 Странное поведение очереди asyncio

Сообщение Anonymous »

Я столкнулся со странным поведением очереди asyncio, когда метод get() не ждет сообщений, если очередь пуста.
Приведенный ниже код использует для работы простой класс с очередью. Я просто запускаю метод start(), который запускает частный метод __send(), в котором мы ожидаем сообщений из очереди.
Сообщения должны быть поставлены в очередь позже с помощью put(). метод класса.
Я знаю, что очередь asyncio не является потокобезопасной, но потоки не используются.

Код: Выделить всё

import asyncio

class MessageQueue:
def __init__(self):
self.proc = None
self.queue = asyncio.Queue()
async def start(self):
self.proc = asyncio.create_task(self.__send())
async def stop(self):
if self.proc is not None:
self.proc.cancel()
async def put(self, mobj):
await self.queue.put(mobj)
async def __send(self):
logger.info('Starting queue.')
while True:
try:
#        if not self.queue.empty():
msg = await self.queue.get()
logger.info(msg)
except Exception as e:
logger.error(f'Error sending the message: {e}')

async def launch():
queue = MessageQueue()
await asyncio.gather(queue.start())

asyncio.run(launch())

В документации сказано, что метод get() должен ждать, если очередь пуста. Но на самом деле я получаю сообщение об ошибке сразу после запуска.
Задача была уничтожена, но она ожидает выполнения!
задача:

Подробнее здесь: https://stackoverflow.com/questions/793 ... ncio-queue
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»