您是否在未指定大小的情况下使用read()或将管道视为迭代器(for line in f
)?如果是这样,那可能是您问题的根源- read()被定义为在返回之前读取直到文件末尾,而不是仅读取可读取的内容。这意味着它将阻塞,直到子代调用close()为止。
在链接到的示例代码中,这没关系- 父级以阻塞方式运行,仅将子级用于隔离目的。如果要继续,则可以按照发布的代码使用非阻塞IO(但准备处理半完成的数据),或者分块读取(例如r.read(size)或r.readline() ),只有在读取了特定的尺寸/行后才会阻塞。(您仍然需要在孩子身上打电话给同花顺)
看起来好像将管道视为迭代器一样,也在使用其他缓冲区,因为for line in r:
如果需要立即使用每一行,“ ”可能无法满足您的需求。可以禁用此功能,但仅在fdopen中为缓冲区大小指定0似乎还不够。
以下是一些应该起作用的示例代码:
import os, sys, time
r,w=os.pipe()
r,w=os.fdopen(r,'r',0), os.fdopen(w,'w',0)
pid = os.fork()
if pid: # Parent
w.close()
while 1:
data=r.readline()
if not data: break
print "parent read: " + data.strip()
else: # Child
r.close()
for i in range(10):
print >>w, "line %s" % i
w.flush()
time.sleep(1)