管道是非阻塞的,明明 select 说了可读,但是读的时候却返回 BlockingIOError: [Errno 11] Resource temporarily unavailable
。我知道对于网络数据,是可能因为接收到数据之后发现校验和不对而丢弃,导致这种情况。可我这里是管道啊……
平台:Python 3.5 on Linux 4.8.4 x86_64
管道是这样创建的:pipe = os.open(path, os.O_RDONLY | os.O_NONBLOCK)
然后扔给子进程用。每次 select 到之后会读一次,然后再 select。
重现率很低。这个程序我用了很久,也就出现了这么一次。
这里可能有答案,但是我不是红帽订阅用户看不到……
看了你的描述,我猜测会不会是资源不足引起的。是不是因为程序用了很久,子进程创建的太多,达到资源使用上限。然后被系统杀死,导致
Resource temporarily unavailable
可以看一下你机器下ps aux| wc -l
运行的进程数,然后看看机器的ulimit -u
的数量。 如果无限接近或超过ulimit的数量有可能产生Resource temporarily unavailable问题。 这是我的猜测,希望能帮到你