Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python: Web
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/12: Рейтинг темы: голосов - 12, средняя оценка - 4.92
kmvcf
1 / 1 / 3
Регистрация: 10.03.2018
Сообщений: 147
1

Почему reader.readline() не корректно работает?

16.01.2019, 09:36. Просмотров 2468. Ответов 8
Метки нет (Все метки)

Добрый вечер.

Есть код который в цикле считывает информацию из объекта reader:

Python
1
2
3
4
5
6
while True:
        line = await reader.readline()
        if not line:
                break
        print(line)
writer.close()
Т.е. когда данные из потока закончились, должен сработать break и соединение должно закрыться.
Почему то соединение не закрывается и приложение зависает.
Что может быть не так?

Добавлено через 11 часов 11 минут
Изменил код на следующий:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
hh = 1
    while True:
        print(hh)
        line = await reader.readline()
        print(hh)
        if not line:
            break
        else:
            print(f'{line}')
        print(hh)
        hh = hh + 1
    print('close')
    writer.close()
Код печатает значение переменной hh.
Потом читает line = await reader.readline()
Печатает значение переменной hh
Потом проверяет наличие данных в line
Если данных нет, то выход из цикла, если есть то печатает значение line
Потом печатает значение переменной hh.
Потом увеличивает счетчик и повторяет цикл заново.

Выяснилось следующее: когда в line заканчиваются данные await их все равно ждет, но так как их там больше нет и не будет соединение зависает.

Почему такой пример в документации на сайте docs.python.org указан как рабочий, а у меня не работает?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2019, 09:36
Ответы с готовыми решениями:

Почему s.readline() не меняет s?
Проблема вот в чем (Python 3.3.2, Win7): Такой код работает: s=open('text.txt').readline()...

Почему выдает ошибку в строке String s = reader.readLine()? Как исправить?
package ruspe******tsempl; /* import java.io.BufferedReader; import java.io.IOException; ...

В чем различие между bufferedReader и reader.readline
в чем различие между bufferedReader и reader.readline

Почему работает не корректно?
Есть большие списки ингредиентов, типа: для теста, для начинки, для крема... они отображаются в...

Почему код работает не корректно?
При нажатии на ссылку, должна исчезать строка. Но этого не происходит. Эта строка исчезает только...

8
vrm2
352 / 242 / 65
Регистрация: 03.12.2015
Сообщений: 518
Завершенные тесты: 2
16.01.2019, 09:46 2
Лучший ответ Сообщение было отмечено kmvcf как решение

Решение

Цитата Сообщение от kmvcf Посмотреть сообщение
Выяснилось следующее: когда в line заканчиваются данные await их все равно ждет, но так как их там больше нет и не будет соединение зависает.
Значит из reader не был получен EOF
1
kmvcf
1 / 1 / 3
Регистрация: 10.03.2018
Сообщений: 147
16.01.2019, 10:33  [ТС] 3
Цитата Сообщение от vrm2 Посмотреть сообщение
Значит из reader не был получен EOF
Как его получить?

Добавлено через 11 минут
Т.е. должен прийти пустой байт b''.
Но если я приложение принудительно не завершаю, т.е. жду, то b'' приходит примерно через минуту.
Почему так может происходить?

Добавлено через 24 минуты
Такой код оказался рабочим:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    hh = 1
    while True:
        print(hh)
        print(time.ctime(time.time()))
        line = await reader.readline()
        print(hh)
        print(time.ctime(time.time()))
        reader.feed_eof()
        if not line:
            print(hh)
            print(f'{line}')
            break
        else:
            print(f'{line}')
        print(hh)
        hh = hh + 1
    print('close')
    writer.close()
В коде перед if not line: был явно вызван reader.feed_eof().
Почему без этого не работает?
Информация об reader.feed_eof() взята на стороннем форуме.
В документации python про reader.feed_eof() вообще информации не нашел.
0
vrm2
352 / 242 / 65
Регистрация: 03.12.2015
Сообщений: 518
Завершенные тесты: 2
16.01.2019, 11:35 4
Лучший ответ Сообщение было отмечено kmvcf как решение

Решение

Цитата Сообщение от kmvcf Посмотреть сообщение
Как его получить?
Об окончании потока должен сообщить writer, ведь только он знает, когда поток закончился и данных больше не будет. Обычно поток просто закрывается (выполняется операция close()).

Цитата Сообщение от kmvcf Посмотреть сообщение
Но если я приложение принудительно не завершаю, т.е. жду, то b'' приходит примерно через минуту.
Почему так может происходить?
Скорее всего, writer закрывается по таймауту. Теперь точно можно сказать, что поток закончился (eof).

Цитата Сообщение от kmvcf Посмотреть сообщение
В коде перед if not line: был явно вызван reader.feed_eof().
Почему без этого не работает?
feed_eof() "сообщил" reader'у, что поток закончился. Без этого reader считает, что поток не закончился, и надо продолжать ждать из него данные.

Цитата Сообщение от kmvcf Посмотреть сообщение
В документации python про reader.feed_eof() вообще информации не нашел.
В документации Python 3.6.8 есть описание feed_eof в модуле streams. В питон 3.7 feed_eof в документации почему-то нет, но упоминание о нем все же есть.
1
16.01.2019, 11:35
Рыжий Лис
Просто Лис
2463 / 1395 / 606
Регистрация: 17.05.2012
Сообщений: 4,627
Записей в блоге: 9
16.01.2019, 11:43 5
Цитата Сообщение от kmvcf Посмотреть сообщение
Как его получить?
Ctrl+D
1
kmvcf
1 / 1 / 3
Регистрация: 10.03.2018
Сообщений: 147
16.01.2019, 13:54  [ТС] 6
Цитата Сообщение от vrm2 Посмотреть сообщение
feed_eof() "сообщил" reader'у, что поток закончился. Без этого reader считает, что поток не закончился, и надо продолжать ждать из него данные.
Как же так?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    hh = 1
    while True:
        print(hh)
        print(time.ctime(time.time()))
        line = await reader.readline()
        print(hh)
        print(time.ctime(time.time()))
        reader.feed_eof()
        if not line:
            print(hh)
            print(f'{line}')
            break
        else:
            print(f'{line}')
        print(hh)
        hh = hh + 1
    print('close')
    writer.close()
Запустили цикл.
Считали данные из потока
Сообщили райдеру что данные закончились
Но конструкция if срабатывает в ветке else.
А в ветке if срабатывает когда получен b''
Значит feed_eof сообщает райдеру что данные закончились только тогда, когда они в действительности закончились? а значит что он проверяет есть ли данные?
0
vrm2
352 / 242 / 65
Регистрация: 03.12.2015
Сообщений: 518
Завершенные тесты: 2
16.01.2019, 15:30 7
Лучший ответ Сообщение было отмечено kmvcf как решение

Решение

Цитата Сообщение от kmvcf Посмотреть сообщение
Запустили цикл.
Считали данные из потока
Сообщили райдеру что данные закончились
Но конструкция if срабатывает в ветке else.
А в ветке if срабатывает когда получен b''
Значит feed_eof сообщает райдеру что данные закончились только тогда, когда они в действительности закончились? а значит что он проверяет есть ли данные?
Записали данные в поток
Запустили цикл
Прочитали ранее записанные данные из потока (запомнили в line)
Сообщили ридеру, что данных больше нет (он "пометочку" себе сделал)
Т.к. в line содержатся данные (not line выдет False), то пошли в ветку else

Вернулись в начало цикла
Ждем новых данных (await reader.readline()). Ой их же нет, возвращаем None
Снова сообщили ридеру, что данных больше нет
Т.к. line is None (not line выдает True), то пошли в ветку then, выполнили break
1
kmvcf
1 / 1 / 3
Регистрация: 10.03.2018
Сообщений: 147
16.01.2019, 16:18  [ТС] 8
Цитата Сообщение от vrm2 Посмотреть сообщение
Ждем новых данных (await reader.readline()). Ой их же нет,
redline считывает данные из потока построчно.
В моем случае я прочитал одну строку и сообщил что данных больше нет. А при прохождении следующей итерации я считываю следующую строку и она там есть.
0
vrm2
352 / 242 / 65
Регистрация: 03.12.2015
Сообщений: 518
Завершенные тесты: 2
16.01.2019, 17:21 9
Цитата Сообщение от kmvcf Посмотреть сообщение
redline считывает данные из потока построчно.
В моем случае я прочитал одну строку и сообщил что данных больше нет. А при прохождении следующей итерации я считываю следующую строку и она там есть.
Если бы следующая строка была, то цикл бы не остановился.
1
16.01.2019, 17:21
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2019, 17:21

Почему программа не работает корректно?
Здравствуйте! Столкнулся с такой проблемой при решении следующей задачи: Задача. Все элементы...

ScroolBox не корректно работает скролл, почему?
Привет всем!!! Я здесь новичок и сразу к вам за ответом=) Создаю программу, работаю со SCROLLBOX ,...

функция удаления работает не корректно почему???
функция удаления в контрольной не работает... возился два дня с ней никак не могу сделать чтоб...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.