socket read死锁php,python的socket解决死锁的几个方法

缓冲流,程序输出和死锁

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

例如,如果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对象,用于这样的直接套接字传输。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值