Видео
f9464fe199877a0a47861fce5ee29b6d_452337_1763220467.mp4 · 1.1 МБ · нажмите — покажем
f9464fe199877a0a47861fce5ee29b6d_452337_1763220467.mp4 · 1.1 МБ · нажмите — покажем
⚡️ ПРИЁМ ДЛЯ ГЛАДКОЙ ПЕРЕДАЧИ ДАННЫХ В ASYNCIO
В сетевом 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())
@Python_Community_ru
934 ·