Python 中因urllib2/urlib遭遇的進程阻塞問題

     最近的項目開發中,Gearman中的worker使用Python中的urllib/urllib2庫大量抓取網頁時,總會出現某個Worker阻塞,偶爾一旦發生worker都被阻塞,就會形成任務大量丟失,爲檢查緣由所在,爲何任務出現中斷,就寫個腳本,利用strace命令,查看全部woker的快照,發現最終被阻塞在recv函數中,而後程序源代碼,發現與網絡讀取有關的,也就是urllib/urllib2中的相關函數,幸好項目就是監控遠程的WEb應用是否活躍,在大量抓取中,已經遭遇不少服務器故意欺騙,於是當時就以爲是服務器故意不傳用數據,導致worker阻塞,可是阻塞的時間又太長,按理說python中的socket 都應該設置有超時時間,不至於一直不放,爲了驗證想法,當時就寫個簡單的服務端程序,接收到數據後,故意不返回任何數據:python

HOST = '172.23.16.42'              編程

PORT = 1024            服務器

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if data:
        print data
        while 1:
            continue
    conn.sendall(data)
conn.close()網絡

 

實際運行後,總體結果以下:socket

3bd173d4900e82073682bf3539e2cd68

發現持續快一小時,依舊被阻塞,於是須要本身實際設置超時,改用urllib2庫,有超時的設置,而後在運行實際程序,發現一旦超時,客戶端自動返回函數

於是在實際的編程中,特別是有關網絡的操做,須要查明默認的超時狀況,並根據本身的須要實際設置本身的超時時間,否則會遭遇意想不到的事情。url

相關文章
相關標籤/搜索