【问题标题】:Python readline on a pipe that has been opened as non-blocking已作为非阻塞打开的管道上的 Python readline
【发布时间】:2010-01-19 13:32:22
【问题描述】:

我有一个以非阻塞模式打开的 Linux fifo。正如预期的那样,当我对文件对象调用 read 时,它会立即返回。我使用 select 来确保没有忙等待,但是当有任何可用数据时,我的程序仍会收到通知。出于好奇,我尝试了 readline 函数,并惊讶地发现 readline 会阻塞,直到找到换行符。我通过 top 检查了处理器的使用情况,似乎 readline 并没有忙于等待。由于我的应用程序对性能很敏感,我想知道在非阻塞套接字上使用 readline 时是否会影响性能。

【问题讨论】:

  • 如果readline 直到换行才缓冲输入,您会如何工作?
  • 除了引发异常,或者可能是 C 级 errno,当前的行为是合理的。我更惊讶的是(如果我观察到的是正确的)Python 在找到换行符之前不会在非阻塞套接字上使用 getc 进行轮询。

标签: python file pipe readline nonblocking


【解决方案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

没有什么特别的。您确定您的观察结果与您认为的一样吗?

【讨论】:

  • 感谢您为我挖掘出这段代码 sn-p。关于您发布的代码,我的问题是如果 fp 是非阻塞的,GETC(fp) 是否会立即返回而没有数据,这意味着 while 循环将快速迭代并浪费 CPU 周期。
  • 我不知道 C 对这种情况做了什么。最好是如果您可以发布可重复的和/或仔细检查您的观察结果。我会假设它正在等待,但你报告它没有。
猜你喜欢
  • 1970-01-01
  • 2016-08-09
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
相关资源
最近更新 更多