Python readline для канала, который был открыт как неблокирующий - PullRequest
3 голосов
/ 19 января 2010

У меня Linux fifo, который был открыт в неблокирующем режиме.Как и ожидалось, когда я вызываю read для файлового объекта, он сразу возвращается.Я использую команду select, чтобы убедиться, что ожидание не занято, но моя программа все еще получает уведомление, когда доступны какие-либо данные.Из любопытства я попробовал функцию readline и с удивлением обнаружил, что блоки readline блокируются, пока не будет найден символ новой строки.Я проверил использование процессора через top, и кажется, что readline не занята ожиданием.Поскольку мое приложение чувствительно к производительности, мне интересно, есть ли какие-либо последствия для производительности при использовании readline на неблокирующем сокете.

1 Ответ

1 голос
/ 20 января 2010

Основная часть readline Python находится в fileobject.c: get_line и имеет значение

FILE_BEGIN_ALLOW_THREADS(f)
FLOCKFILE(fp);

while ((c = GETC(fp)) != EOF &&
       (*buf++ = c) != '\n' &&
       buf != end)
       ;
FUNLOCKFILE(fp);
FILE_END_ALLOW_THREADS(f)

, где

#ifdef HAVE_GETC_UNLOCKED
#define GETC(f) getc_unlocked(f)
#define FLOCKFILE(f) flockfile(f)
#define FUNLOCKFILE(f) funlockfile(f)
#else
#define GETC(f) getc(f)
#define FLOCKFILE(f)
#define FUNLOCKFILE(f)
#endif

Ничего особенного не происходит.Вы уверены, что ваши наблюдения соответствуют вашим ожиданиям?

...