Python 3.4+Асинхронное программированиепонятие
asyncio.WriteTransport
протоколы и транспорты
Транспорт только для записи: write() кладёт байты в буфер и возвращается сразу, а водяные знаки буфера управляют обратным давлением.
Синтаксис
transport.write(data); transport.writelines(list_of_data); transport.set_write_buffer_limits(high=None, low=None)
write() не корутина и ничего не ждёт: если получатель медленный, буфер растёт без предела, пока протокол не начнёт слушать pause_writing()/resume_writing(). Пороги задаёт set_write_buffer_limits(high, low), по умолчанию это 64 КиБ и 16 КиБ. В потоках ту же задачу решает await writer.drain() — именно поэтому его нельзя пропускать в цикле записи. write_eof() закрывает только запись, если can_write_eof() истинно.
Примеры
import asyncio
import socket
async def main():
a, b = socket.socketpair()
reader, writer = await asyncio.open_connection(sock=a)
t = writer.transport
print(t.get_write_buffer_limits()) # → (16384, 65536) — (low, high)
t.write(b'ping') # без await: байты ушли в буфер
print(t.can_write_eof()) # → True
await asyncio.sleep(0.01)
print(b.recv(10)) # → b'ping'
t.close()
await asyncio.sleep(0.01)
b.close()
asyncio.run(main())
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности