死锁现象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了死锁现象相关的知识,希望对你有一定的参考价值。

死锁发生在当一个服务器和客户端同时试图往一个连接上写东西和同时从一个连接上读的时候。在这种情况下没有进程可以得到任何数据。

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#测试锁死的情况
import socket, traceback

host = ‘‘        #主机设为空,程序就可以接收来自任何客户端的连接
port = 51422     #设置端口,选择一个任意大于1024的端口即可

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建socket对象,
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #把socket设置成可复用的
s.bind((host, port))     
s.listen(5)              

while True:
    try:  
        clientsock, clientaddr = s.accept()
    except KeyboardInterrupt:
        raise
    except:
        traceback.print_exc()
        continue
    
    try:
        print "Got connection from", clientsock.getpeername()
        while 1:
            data = clientsock.recv(4096)     #把在客户端写入的数据返回给客户
            if not len(data):
                break
            clientsock.sendall(data)
    except (KeyboardInterrupt, SystemExit):
        raise
    except:
        traceback.print_exc()

#close the connection
    try:
        clientsock.close()
    except KeyboardInterrupt:
        raise
    except:
        traceback.print_exc()
客户端测试:
[[email protected] one]# telnet localhost 51422
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is ‘^]‘.
wang
wang
wang
wang
tian
tian
xiang
xiang
shang
shang
hao
hao

客户端响应服务器的例子:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import socket, sys
port = 51422
host = "localhost"
data = "x" * 10485760

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s = s.connect((host, port))

bytestwritten = 0
while bytestwritten <= len(data):
    startpos = bytestwritten
    endpos = min(bytestwritten + 1024 ,len(data))
    bytestwritten += s.send(data[startpos:endpos])    //感觉这点有一个问题
    sys.stdout.write("Wrote %d bytes\r" % bytestwritten)
    sys.stdout.flush()

s.shutdown()

print "All data sent"
while 1:
    buf = s.recv(1024)
    if not len(buf):
        break
    sys.stdout.write(buf)

启动服务器,接着运行响应服务器。服务器将显示有来自客户端的连接。客户端试图发送一个10Mb的数据,以1KB为单位传到服务器,接着它会取回结果。

10MB数据永远也传送不完。服务器会读取开始的4KB,试图在写完之后重复这个过程。因为客户端在发送完所有数据之前根本不进行任何的操作,操作系统的传输buffer在某一点上就会充满,两个进程就会在send()函数停滞。

本文出自 “自定义” 博客,谢绝转载!

以上是关于死锁现象的主要内容,如果未能解决你的问题,请参考以下文章

死锁现象与递归锁

2-7 死锁现象和递归锁

python 并发编程 多线程 死锁现象与递归锁

死锁编码及定位分析

网络编程基础--多线程---concurrent.futures 模块---事件Event---信号量Semaphore---定时器Timer---死锁现象 递归锁----线程队列queue(示例代码

死锁现象