我有一个库的 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)
不过,这并不完全奏效。分叉的进程在写入时挂起。我想一次发送太多吗?这个问题有更简单的解决方案吗?