Задать вопрос
@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>>

Подскажите как исправить..
Буду благодарен!
  • Вопрос задан
  • 192 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillbox
    Профессия Python-разработчик + ИИ
    10 месяцев
    Далее
Решения вопроса 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) # ждем некоторое время, пока буфер записи не освободится


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

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

Похожие вопросы
ITK academy Краснодар
от 220 000 до 300 000 ₽
ITK academy Краснодар
от 75 000 ₽
DimaTech Ltd Краснодар
от 140 000 до 140 000 ₽