㈠ python程序問題:urlopen()控制
使用try...except來對urlopen出錯進行控制,通過socket模塊的setdefaulttimeout函數來控制超時時間,python3.x示例代碼如下:
importurllib.request
importsocket
socket.setdefaulttimeout(10)#設置超時時間
#要下載的網頁列表
urls=['http://www.test.com/1.htm',
'http://www.test.com/2.htm',
'http://www.test.com/3.htm',
'http://www.test.com/4.htm',
'http://www.test.com/5.htm',
'http://www.test.com/6.htm']
forurlinurls:
try:
html=urllib.request.urlopen(url)
#處理得到的網頁
except:
#出錯處理
㈡ 求助關於python 的socket.timeout: timed out錯誤問題:
最好是先設置好超時時間
socket.setdefaulttimeout 或者urllib2.socket.setdefaulttimeout
來設置默認超時時間
也可以直接指定
urlopen(url, data=None, timeout=<object object>)
我在win下也寫過python腳本,一旦except到了指定錯誤,腳本標會退出
這樣不會出錯
try:
pass
except:
do something
但不是你的本意了
linux操作是沒有這個問題的
希望可以幫到你
㈢ socket超時什麼意思
你好,這分為兩種情況。
Socket.connect連接超時有二種情況:
1.由於網路的問題,TCP/IP三次握手時間>timeout的設置時間。這在國外訪問weibo時,並且網路環境極差的情況下有可能發生。
解決的辦法:調大socket.connect方法中的timeout參數值,比如50s,linux默認最高是70s,如果超過70s沒有意義,linux會採用70s.
但是當調大之後,發現不到10s就報timeout exception。
通過國外的機器ping api.weibo.com發現unreachable。
說明客戶端在傳輸層之下的網路層就發現連個Syn的報文都發不出去,更不用說三次握手了,客戶端直接失敗並拋timeout exception。
經驗:在connection timeout診斷的第一步應該是ping一下確認網路層沒有問題。
註:客戶端設置了timeout,但並不會等到超時才返回異常。客戶端只要第一時間發現連接失敗,就會拋timeout exception。
2.如果timeout設置的時間足夠,但是由於伺服器端的處理能力較差,比如緩沖連接隊列較小,而應用層的處理能力沒有連接緩沖快,導致緩沖連接占滿,而拒絕新的連接。
在服務端因為連接隊列占滿而拒絕服務的期間,客戶端的通過TCP協議重試三次。每次的時間翻倍。
如果三次時間的累加<timeout參數值且能連接上,屬於正常情況,表示隊列騰出空位放當前連接。
如果三次時間的累加<timeout參數值且未能連接上,則客戶端會立刻拋出timeout exception,而不等timeout到期才拋。
1.讀寫超時
read超時設置有意義,在伺服器處理能力差,但最終會響應的情況下,可以將客戶端的等待響應時間設長一些。如果太長的話,由於客戶端使用的是BIO的方式,線程會一直阻塞在IO而導致掛起。當客戶端的處理能力明顯快於服務端,這樣掛起的線程會很多。
不管客戶端還是伺服器端,當有很多線程阻塞時,對機器的性能都會影響。我在weibo的論壇上看到有人在read timed out後,將soTimeout的時間設為100s。這是很危險的,新浪的伺服器一旦崩潰,自己的伺服器也會由於大量線程積壓崩潰。
因為線程在掛起之後,它掌握的資源並不會釋放,比如內存,直到阻塞完成。同時大量線程的掛起就意味著系統要做大量上下文的恢復並調度執行。
解決辦法:
如果客戶端使用NIO的方式,如果服務端的響應能標出客戶端的請求,則線程在客戶端請求之後,完全可以把請求放入一個BlockQueue,然後利用Future或Wait/Notify等機制在帶著請求標志的響應返回的時候,喚想隊列中的請求接著處理,從而實現非同步處理,可以用少量線程服務大量請求。
同樣,如果伺服器端可以使用NIO做到請求每線程處理,而不是連接每線程,可以大大減少線程掛起導致資源的浪費,NIO適用於連接很多,請求很少的場合。另外,Commet又稱為伺服器推技術,它的主要特點是長連接。避免客戶端低效的請求輪詢。主要用於聊天室,WEIBO,因為連接多,請求不一定多,同樣也適合在伺服器端使用NIO
註:read timeout異常時,並不需要ping遠程機器,因為它是輔助定位connection timeout,如果ping不通,肯定是conneciton timeout而不會到read timeout。read timeout exception不會導致連接中斷。為重試提供了機會。
2.write超時一般不象connection timeout和read timeout可以在客戶端顯示調值,TCP有寫重傳的概念,一般8m內會重試,否則,直接斷開連接。
如果對您有幫助,還望採納。
㈣ python 連接 mysql 超時,請問怎麼解決
使用Python操作MySQL資料庫的時候常使用MySQLdb這個模塊。 今天在開發的過程發現MySQLdb.connect有些參數沒法設置。通過這個頁面我們可以看到在connect的時候,可以設置的option和client_flags和MySQL c api相比差不少。
㈤ python獲取當前socket連接狀態,是連接還是斷開。
socket建立連接後,你可以在上面加一個超時,如果超時異常出現就是斷開了。
另外可以用select(inlist,writelist,errorlist,timeout)的辦法,去輪詢它。超過比如60秒,就認為它超時。
在操作系統層面,你可以用netstat
找到這個socket連接,看它的TCP狀態。如果到了CLOSE_WAIT,
TIME_WAIT,就是對方或者是自己關閉了。
如果是FIN2.。。。SEN。。或者是SYN_XXX就是還是連接或者是發送狀態中。
通常這些狀態在操作系統的TCP協議里都設置有超時。如果超時過了,它自己會關閉。然後變成WAIT狀態。
㈥ python3套接字udp設置接受數據超時
Sometimes,you need to manipulate the default values of certain properties of a socket library, for example, the socket timeout.
設定並獲取默認的套接字超時時間。
1.代碼
1 import socket
2
3
4 def test_socket_timeout():
5 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
6 print("Default socket timeout: %s" % s.gettimeout())
7 # 獲取套接字默認超時時間
8 s.settimeout(100)
9 # 設置超時時間
10 print("Current socket timeout: %s" % s.gettimeout())
11 # 讀取修改後的套接字超時時間
12
13
14 if __name__ == '__main__':
15 test_socket_timeout()
2. AF_INET和SOCK_STREAM解釋
1 # 地址簇
2 # socket.AF_INET IPv4(默認)
3 # socket.AF_INET6 IPv6
4 # socket.AF_UNIX 只能夠用於單一的Unix系統進程間通信
5
6 # socket.SOCK_STREAM(數據流) 提供面向連接的穩定數據傳輸,即TCP/IP協議.多用於資料(如文件)傳送。
3.gettimeout()和settimeout()解釋
1 def gettimeout(self): # real signature unknown; restored from __doc__
2 """
3 gettimeout() -> timeout
4
5 Returns the timeout in seconds (float) associated with socket
6 operations. A timeout of None indicates that timeouts on socket
7 operations are disabled.
8 """
9 return timeout
10
11
12 def settimeout(self, timeout): # real signature unknown; restored from __doc__
13 """
14 settimeout(timeout)
15
16 Set a timeout on socket operations. 'timeout' can be a float,
17 giving in seconds, or None. Setting a timeout of None disables
18 the timeout feature and is equivalent to setblocking(1).
19 Setting a timeout of zero is the same as setblocking(0).
20 """
21 pass
22 # 設置套接字操作的超時期,timeout是一個浮點數,單位是秒。值為None表示沒有超時期。
23 # 一般,超時期應該在剛創建套接字時設置,因為它們可能用於連接的操作(如 client 連接最多等待5s )
4.運行結果
1 Default socket timeout: None
2 Current socket timeout: 100.0
㈦ 求助關於python 的socket.timeout:timed out錯誤問題
最好是先設置好超時時間
socket.setdefaulttimeout 或者urllib2.socket.setdefaulttimeout
來設置默認超時時間
也可以直接指定
urlopen(url, data=None, timeout=<object object>)
我在win下也寫過python腳本,一旦except到了指定錯誤,腳本標會退出
這樣不會出錯
try:
pass
except:
do something
但不是你的本意了
linux操作是沒有這個問題的
㈧ Python中socket里的.recv()函數問題
可以通過setsockopt,或者更簡單的setblocking,
settimeout設置。阻塞式的socket的recv服從這樣的規則:
當緩沖區內有數據時,立即返回所有的數據;當緩沖區內無數據時,阻塞直到緩沖區中有數據。非阻塞式的socket的recv服從的規則則是:
當緩沖區內有數據時,立即返回所有的數據;當緩沖區內無數據時,產生EAGAIN的錯誤並返回(在Python中會拋出一個異常)。兩種情況都不會返回空字元串,返回空數據的結果是對方關閉了連接之後才會出現的。
㈨ python3中,socket,當伺服器端沒有發送數據時,如何不讓客戶端recv一直等待數據
超時法
設定一個時限,時限內一直未收到數據即超時,超時則客戶端主動斷開連接