在非阻塞模式下读取管道的Python readline
我有一个在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