Python网络编程 3.2 可能出现死锁的tcp服务器、客户端

本文介绍了Python网络编程中TCP服务器和客户端可能出现的死锁问题,详细分析了死锁原因,并提供了两种解决办法:关闭套接字阻塞或使用多线程/进程。同时,讨论了已关闭连接和半开连接的概念,以及如何使用shutdown()调用来管理通信连接的关闭方向。
摘要由CSDN通过智能技术生成

源代码可以在书的作者的github上找到,也可以参考本人GitHub中参考源代码改出来的代码点击打开链接 tcp_deadlock.py

1) 死锁的原因:首先,客户端使用sendall()发送数据块,然后服务器使用recv()来接收、处理,接着将数据转换为大写,并再次使用sendall()调用将结果传回。当传输并不多的数据的时候,可以正常运行,但是传输很大的数据的时候就会出问题。因为,由于客户端要一次性把所有数据发送完才开始接收服务器返回的大写数据,因此在发送结束前客户端不会运行recv()调用。因此,越来越多的数据填满了操作系统的缓冲区,缓冲区就无法接受更多的数据了。

2) 死锁的解决办法:当处理大量数据时,为了避免死锁,有以下两种可能的方案。

第一,客户端和服务器可以通过套接字选项将阻塞关闭。这样一来,send()和recv()这样的调用在得知还不能发送或接收数据时就会立即返回。

第二,程序可以使用某种技术同时处理来自多个输入的数据。可以采用多线程或进程来处理。比如,一个用来像套接字发送数据,另一个可能就负责从套接字读取数据;也可以运行select()或pull()等操作系统调用,使得程序在发送套接字和接收套接字繁忙时等待,当它们之中任何一个空闲时就做出响应。

3) 已关闭连接,半开连接:当没有数据可用的时候,非阻塞套接字的recv()调用就可能会抛出一个异常。在这种情况下,需要一种技术去来确定套接

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值