博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python的socket解决死锁的几个方法
阅读量:4229 次
发布时间:2019-05-26

本文共 929 字,大约阅读时间需要 3 分钟。

缓冲流,程序输出和死锁

标准流通常是可以缓冲的,输出的文本可能需要刷新,所以它在连接到某个进程的输出流时可以在套接字上显示。事实上,客户端需要显示或者隐式的刷新调用来正常工作;否则它们的输出是不完整的或者缺省的,直到程序退出为止,这种情况可能导致死锁—某个进程等待另一个进程永远不会输出的输出结果。在其他配置中,如果某个写入器退出较早,我们也可能得到某个读取器的套接字错误,尤其是在双向会话中。

例如,如果client1和client2没有像它们一样定期刷新,那么它们能工作的唯一原因就是输出流在进程退出时可以自动刷新。没有手动刷新,client1就不能转换数据,直到进程退出为止,而且client2的数据在退出前是不完整的。在一般情况下,如果我们想在输出结果出来时,而不是在程序退出或其缓冲区填满时读取程序结果,那么程序必须周期性调用sys.stdout.flush。

解决方案

为了避免延迟的输出或死锁,可能通过输出到封装的套接字发送数据到等待的程序,应该执行下面列出的操作之一:

  • 周期性地调用sys.stdout.flush来刷新其输出结果,使其在产生时可以获得

  • 使用python命令行标志 -u来运行,迫使输出流进入五缓冲状态。该方法适用于管道工具(如os.popen)产生的未修改程序。

  • 使用线程从套接字读取以避免阻塞,尤其是当接收程序是某一个GUI,且不能依赖于客户端来刷新时。这并没有真正解决问题—派生的reader线程也可能进入阻塞状态或者死锁状态

  • 实现它们自身的自定义套接字封装对象,其可以拦截文本write调用,编码为二进制,以及路由到由send调用的套接字;socket.makefile实际上只是一个 便利工具,我们总是可以为更具体的功能,编写我们自己的封装代码,可以参阅GuiOutput类,流重定向类,以及io标准库模块类(python的输入\输出工具都是基于它们,而且可以自定义组合)

  • 完全跳过print,直接和IPC设备的本地接口通信,如套接字对象的原始send和recv方法,它们会立即传输数据,不会像文件方法一样缓冲数据。可以用这种方法传递简单的字节字符串,或把字节字符串转换成python对象,用于这样的直接套接字传输。

转载地址:http://iknqi.baihongyu.com/

你可能感兴趣的文章
基于微区块链的V2X地理动态入侵检测
查看>>
面向V2C场景的ADAS数字孪生模型构建方法
查看>>
Comma2k19数据集使用
查看>>
面向自动驾驶车辆验证的抽象仿真场景生成
查看>>
一种应用于GPS反欺骗的基于MLE的RAIM改进方法
查看>>
自动驾驶汽车GPS系统数字孪生建模(一)
查看>>
自动驾驶汽车GPS系统数字孪生建模(二)
查看>>
CUDA 学习(五)、线程块
查看>>
CUDA 学习(八)、线程块调度
查看>>
CUDA 学习(九)、CUDA 内存
查看>>
CUDA 学习(十一)、共享内存
查看>>
游戏感:虚拟感觉的游戏设计师指南——第十四章 生化尖兵
查看>>
游戏感:虚拟感觉的游戏设计师指南——第十五章 超级马里奥64
查看>>
游戏感:虚拟感觉的游戏设计师指南——第十七章 游戏感的原理
查看>>
游戏感:虚拟感觉的游戏设计师指南——第十八章 我想做的游戏
查看>>
游戏设计的艺术:一本透镜的书——第十章 某些元素是游戏机制
查看>>
游戏设计的艺术:一本透镜的书——第十一章 游戏机制必须平衡
查看>>
UVM:7.5.1 期望值与镜像值
查看>>
UVM:7.5.2 常用操作及其对期望值和镜像值的影响
查看>>
UVM:7.6.1 检查后门访问中hdl 路径的sequence
查看>>