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



