源代码可以在书的作者的github上找到,也可以参考本人GitHub中参考源代码改出来的代码点击打开链接 tcp_deadlock.py
1) 死锁的原因:首先,客户端使用sendall()发送数据块,然后服务器使用recv()来接收、处理,接着将数据转换为大写,并再次使用sendall()调用将结果传回。当传输并不多的数据的时候,可以正常运行,但是传输很大的数据的时候就会出问题。因为,由于客户端要一次性把所有数据发送完才开始接收服务器返回的大写数据,因此在发送结束前客户端不会运行recv()调用。因此,越来越多的数据填满了操作系统的缓冲区,缓冲区就无法接受更多的数据了。
2) 死锁的解决办法:当处理大量数据时,为了避免死锁,有以下两种可能的方案。
第一,客户端和服务器可以通过套接字选项将阻塞关闭。这样一来,send()和recv()这样的调用在得知还不能发送或接收数据时就会立即返回。
第二,程序可以使用某种技术同时处理来自多个输入的数据。可以采用多线程或进程来处理。比如,一个用来像套接字发送数据,另一个可能就负责从套接字读取数据;也可以运行select()或pull()等操作系统调用,使得程序在发送套接字和接收套接字繁忙时等待,当它们之中任何一个空闲时就做出响应。
3) 已关闭连接,半开连接:当没有数据可用的时候,非阻塞套接字的recv()调用就可能会抛出一个异常。在这种情况下,需要一种技术去来确定套接