Python 3.4+Асинхронное программированиепонятие
asyncio.Protocol
протоколы и транспорты
Протокол потокового соединения (TCP, Unix-сокет, SSL): цикл вызывает data_received() на каждую порцию байтов и eof_received() в конце.
Синтаксис
transport, protocol = await loop.create_connection(ProtocolClass, host, port)
Учащемуся этот уровень обычно не нужен: для TCP есть потоки asyncio.open_connection() и asyncio.start_server(), для процессов — asyncio.create_subprocess_exec(). Главная ловушка — data_received() не знает границ сообщений: одно отправленное сообщение может прийти двумя кусками, а два — одним, так что буфер и поиск разделителя пишете вы сами (в StreamReader это готовые readline() и readuntil()). Протокол оправдан там, где нужна максимальная скорость без лишних корутин.
Примеры
import asyncio
import socket
class Echo(asyncio.Protocol):
def connection_made(self, transport):
self.transport = transport
def data_received(self, data):
print('получено', data) # → получено b'ping'
self.transport.write(data.upper())
async def main():
loop = asyncio.get_running_loop()
left, right = socket.socketpair() # локальная пара сокетов вместо сети
transport, proto = await loop.create_connection(Echo, sock=left)
right.sendall(b'ping')
await asyncio.sleep(0.01)
print(right.recv(10)) # → b'PING'
transport.close()
right.close()
asyncio.run(main())
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности