当 PIPE 的写入方写的太快,但是读取方来不及读取的时候,就会把 buffer 给写满从而出现 resource temporarily unavailable 错误。在 linux 下可以通过 fcntl.fcntl(fd, fcntl.F_SETPIPE_SZ, size) 来设置 PIPE 的 buffer 大小。
相关 Python 代码如下:
import fcntl
import platform
try:
if platform.system() == 'Linux':
fcntl.F_SETPIPE_SZ = 1031
fcntl.fcntl(fd, fcntl.F_SETPIPE_SZ, size)
except IOError:
print('can not change PIPE buffer size')
一般可以通过 read_fd, write_fd = os.pipe() 来生成 pipe, 此时上面的 fd 对应 read_fd 和 write_fd 。
- 捕获 IOError 异常是因为有的 linux 内核版本不支持修改 PIPE buffer 大小。
- python 的 fcntl 没有 F_SETPIPE_SZ 属性,所以我们定义了这个属性,它的值来自 fcntl.h 。
Comments