在stdout / stderr文件描述符上调用os.fsync将杀死一个子进程

使用Python子流程库生成子流程后,我使用stderr将消息从子流程传递到包含某些序列化数据的父流程.然后,我希望父级返回(通过stdin)应用于该数据的函数的结果.

本质上,我在子流程中有一个函数,它可以执行以下操作:

sys.stderr.write("some stuff to write")
# some time later
some_var = sys.stdin.read()

但是,这会在等待stderr输入时完成锁定父级,因此我尝试调用:

sys.stderr.flush()
os.fsync(sys.stderr.fileno())

但是,这不起作用.在执行os.fsync之后什么都没有.另外,当我在父进程中调用proc.poll()时,它出现了,子进程的返回代码为1.

我该怎么做才能避免这种情况?我应该考虑另一种方法吗?

解决方法:

我会考虑另一种方法.
您可以使用一个独立的进程(multiprocessing.Process),并使用两个队列与它进行通信(multiprocessing.Queue),一个队列用于输入,另一个队列用于输出.
启动过程的示例:

import multiprocessing

def processWorker(input, result):
    work = input.get()
    print work
    result.put(work*work)

input  = multiprocessing.Queue()
result = multiprocessing.Queue()

p = multiprocessing.Process(target = processWorker, args = (input, result))
p.start()

input.put(2)
res = result.get(block = True)
print res

然后,您可以反复传递它.因为您不需要依赖stdout / err解析,而且还避免了相关限制,所以multiprocessing.Queue的用法更加可靠.
此外,您可以轻松管理更多子流程.

然后,您还可以设置一个超时时间,该超时时间是您希望get呼叫最多等待多长时间,例如:

import queue
try:
    res = result.get(block = True, timeout = 10)
except Queue.Empty:
    print error
上一篇:File system IO可靠性


下一篇:Apollo核心概念之 “Namespace”