命名管道在Python中未刷新
我用os.mkfifo()命令创建了一个命名管道。现在有两个不同的Python进程在使用这个命名管道,进程A负责读取,进程B负责写入。进程A使用select函数来判断管道里是否有数据可读。尽管进程B在每次写入后都会刷新数据,但进程A的select函数并不总是能返回(它一直处于阻塞状态,好像没有新数据一样)。我仔细研究了这个问题,最后我让进程B在真正写入之前和之后各写入5KB的无用数据,而进程A则被编程成忽略这5KB的无用数据。现在一切都正常,select函数总是能正确返回。我发现这个“变通”方法是因为注意到如果进程B被杀掉,进程A的select函数就会返回(因为进程B在写入和刷新后会在读取管道上睡眠)。我想知道在Python中,命名管道的flush是否存在问题?
3 个回答
0
对于命名管道来说,刷新操作是没什么用的。因为命名管道中的数据是完全保存在内存里的,只有在数据被读取或者管道关闭时,这些数据才会被释放。
1
要检查Python内部的缓冲机制是否在影响你的程序,可以在运行脚本时用“python -u”来替代“python”。这样做会让Python进入“无缓冲模式”,也就是说所有的输出会立刻显示出来,不会再等着一起打印。
1
你在用什么API呢?os.read()
和 os.write()
这两个函数不会进行任何缓存。