我有一个库的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)
但这并不是很有效.分叉的进程在写入时挂起.我想一次发送太多吗?这个问题有一个更简单的解决方案吗?
解决方法:
可能你正在尝试编写的数据超出管道的数量,所以它会阻塞,直到有人出现并从中读取一些信息.这种情况永远不会发生,因为唯一的读者是父进程,您似乎已经编写该进程以等待子进程在读取任何内容之前终止.这就是我们所说的死锁.
您可以考虑取出os.waitpid调用,看看会发生什么.另一种选择是看os.pipe是否有任何方法可以给它一个更大的缓冲区(我不知道你的环境足以说明).
标签:python,fork,pipe 来源: https://codeday.me/bug/20190827/1743647.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。