У меня есть подкласс asyncio.Protocol
, получающий данные с сервера. Я сохраняю эти данные (каждую строку, потому что это текст) в asyncio.Queue
.
import asyncio
q = asyncio.Queue()
class StreamProtocol(asyncio.Protocol):
def __init__(self, loop):
self.loop = loop
self.transport = None
def connection_made(self, transport):
self.transport = transport
def data_received(self, data):
for message in data.decode().splitlines():
yield q.put(message.rstrip())
def connection_lost(self, exc):
self.loop.stop()
loop = asyncio.get_event_loop()
coro = loop.create_connection(lambda: StreamProtocol(loop),
'127.0.0.1', '42')
loop.run_until_complete(coro)
loop.run_forever()
loop.close()
Я хочу, чтобы другая сопрограмма отвечала за потребление данных в очереди и их обработку.
- Это должно быть
asyncio.Task
? - Что делать, если очередь становится пустой из-за того, что в течение нескольких секунд данные не принимаются? Как я могу убедиться, что мой потребитель не остановится (
run_until_complete
)? - Есть ли более чистый способ, чем использование глобальной переменной для моей очереди?
data_received
должна быть обычной функцией, а не сопрограммой сyield
внутри. Более того,asyncio.Queue
требуетyield from
, а не толькоyield
. - person Andrew Svetlov   schedule 01.02.2016