針對連接(connect)時候的超時:python
# 法一: import socket socket.setdefaulttimeout(5) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) sock.sendall('xxx') sock.recv(1024) sock.close() ''' 20160716 update socket.setdefaulttimeout(5) 此句必須放到創建連接的前面,不然超時設置無效果 '''
# 法二: import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(5) sock.connect((host, port)) # 恢復默認超時設置,設置某些狀況下socket進入阻塞模式(如makefile) sock.settimeout(None) sock.connect((host, port)) sock.sendall('xxx') sock.recv(1024) sock.close()
針對接收(recv)數據時的超時:socket
# 法一: import socket socket.setdefaulttimeout(5) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) sock.sendall('xxx') # 鏈接和接收的時候都設置一次超時 sock.settimeout(5) sock.recv(1024) sock.close()
# 法二[未驗證]: import select mysocket.setblocking(0) ready = select.select([mysocket], [], [], timeout_in_seconds) if ready[0]: data = mysocket.recv(4096)
參考連接:code
http://stackoverflow.com/questions/2719017/how-to-set-timeout-on-pythons-socket-recv-methodio