在非阻塞模式下读取管道的Python readline

3 投票
1 回答
1713 浏览
提问于 2025-04-15 18:12

我有一个在Linux上打开的FIFO(先进先出队列),它是以非阻塞模式运行的。正如我预期的那样,当我对这个文件对象调用read时,它会立即返回。我使用select来确保不会出现忙等待的情况,这样我的程序在有数据可用时仍然能收到通知。出于好奇,我试了一下readline函数,发现它会一直等待,直到找到换行符。我通过top命令查看了处理器的使用情况,发现readline并不会造成忙等待。因为我的应用对性能要求很高,所以我想知道在非阻塞套接字上使用readline是否会对性能产生影响。

1 个回答

1

Python的readline功能的核心部分在文件对象的代码里,具体是在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

撰写回答