@datareset
развиваюсь.

Asyncio.StreamWriter перестает отсылать запросы, что делать?

Приветствую!
Пишу приложение, используя сокеты asyncio, и после циклических запросов перестают отправлять другие
while request_screen:
     writer.write(b'screenshare')
     await writer.drain()

Я заметил, что до выполнения циклических запросов writer при выводе выглядит так:
<StreamWriter transport=<_ProactorSocketTransport fd=1168 read=<_OverlappedFuture pending overlapped=<pending, 0x1bc7ca13a30> cb=[_ProactorReadPipeTransport._loop_reading()]> write=<_OverlappedFuture finished result=3>> reader=<StreamReader waiter=<Future pending cb=[Task.task_wakeup()]> transport=<_ProactorSocketTransport fd=1168 read=<_OverlappedFuture pending overlapped=<pending, 0x1bc7ca13a30> cb=[_ProactorReadPipeTransport._loop_reading()]> write=<_OverlappedFuture finished result=3>>>>

Но после так:
<StreamWriter transport=<_ProactorSocketTransport fd=1168 write=<_OverlappedFuture finished result=3>> reader=<StreamReader 173203 bytes transport=<_ProactorSocketTransport fd=1168 write=<_OverlappedFuture finished result=3>> paused>>

Подскажите как исправить..
Буду благодарен!
  • Вопрос задан
  • 168 просмотров
Решения вопроса 1
@datareset Автор вопроса
развиваюсь.
Указав паузу начало нормально функционировать
while request_screen:
                    writer.write(b'screenshare')
                    await writer.drain()
                    await asyncio.sleep(0.1)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@whoiam_frontend
Python-разработчик
Проблема может быть связана с тем, что буфер записи (write buffer) StreamWriter переполнен, и поэтому запись заблокирована. Чтобы решить эту проблему, можно увеличить размер буфера записи StreamWriter с помощью параметра `high_water`:

writer = await asyncio.open_connection(host, port)
writer = asyncio.StreamWriter(writer, {'high_water': 256*1024}) # устанавливаем размер буфера в 256 КБ


Также может быть полезно использовать метод `can_write()` для проверки, можно ли записать данные в настоящий момент:

while request_screen:
     if writer.can_write():
         writer.write(b'screenshare')
         await writer.drain()
     else:
         await asyncio.sleep(0.1) # ждем некоторое время, пока буфер записи не освободится


Это заставит цикл ожидать некоторое время, пока буфер записи не освободится, прежде чем продолжать отправку данных.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы