В сетевом Python можно «мягко» ограничивать скорость передачи данных без троттлинга на уровне сокета.
Приём - отправлять данные кусками и вставлять короткий
await asyncio sleep после каждого drain(): это отдаёт управление циклу, даёт шанс другим корутинам и предотвращает монополизацию CPU. Полезно в высоконагруженных стримерах.
простой «мягкий» троттлинг передачи данных
import asyncio
CHUNK = 32_000
async def send_smooth(writer, data: bytes):
for i in range(0, len(data), CHUNK):
writer.write(data[i:i+CHUNK])
await writer.drain()
await asyncio.sleep(0) # отдаём управление циклу
async def handle(reader, writer):
payload = b"x" * 5_000_000
await send_smooth(writer, payload)
writer.close()
await writer.wait_closed()
async def main():
srv = await asyncio.start_server(handle, "0.0.0.0", 8888)
async with srv:
await srv.serve_forever()
asyncio.run(main())
@pythonl