我有一个库的ctypes包装。不幸的是,这个库不是100%可靠的(偶尔会出现段错误等)。由于它的使用方式,我希望封装对图书馆崩溃具有相当的适应性。如何从分叉进程发送大量数据?
做到这一点的最好方法似乎是分离一个过程并将结果从孩子中发回。我想沿着这些线做些事情:
r, w = os.pipe()
pid = os.fork()
if pid == 0:
# child
result = ctypes_fn()
os.write(w, pickle.dumps(result))
os.close(w)
else:
# parent
os.waitpid(pid, 0)
result = os.read(r, 524288) # can be this big
os.close(r)
return pickle.loads(result)
虽然这并不完美。分叉进程在写入时挂起。我是否试图一次发送太多?有一个更简单的解决方案来解决这个问题吗?
+1:家长应持续阅读,直到EOF。当管道到达EOF时,这意味着孩子已完成(完成或坠毁)。 – 2009-04-16 19:18:53