2008-10-21 81 views
2
url = "http://example.com/file.xml" 
data = urllib2.urlopen(url) 
data.read() 

現在的問題是,什麼時候該文件從網上下載?當我做urlopen或.read()?在我的網絡接口上,我看到兩次都有很高的流量。何時urllib2實際上從網址下載文件?

回答

5

不用其他看代碼,我期望會發生以下情況:

  1. urlopen()打開連接,並將查詢。然後服務器開始提供回覆。此時,數據在緩衝區中累積,直到它們已滿並且操作系統告訴服務器保持一段時間。
  2. 然後data.read()清空緩衝區,所以操作系統會通知服務器繼續運行,並回復其餘部分。

當然,如果回覆足夠短,或者.read()發生得足夠快,那麼緩衝區沒有時間填滿並且下載一次發生。

+0

感謝您快速回答 – user20955 2008-10-21 20:36:09

5

我同意ddaa。但是,如果您想了解這類事情,則可以使用類似nc(在* nix中)的方式設置虛擬服務器,然後在交互式Python解釋器中打開該URL。

在一個終端中,運行nc -l 1234,它將打開一個套接字並偵聽本地計算機的端口1234上的連接。 nc將接受傳入的連接並顯示從套接字讀取的任何內容。您輸入nc的任何內容都將通過套接字發送到遠程連接,在本例中爲Python的urlopen()

運行Python在另一個端子和輸入您的代碼,即

data = urllib2.urlopen('http://127.0.0.1:1234') 
data.read() 

urlopen()到調用將建立到服務器的連接,發送該請求,然後方框等待響應。您將看到nc將HTTP請求打印到其終端中。

現在,在運行nc的終端中輸入內容。撥打urlopen()仍然會阻止,直到您按nc中的ENTER,即,直到它收到一個新的行字符。因此,urlopen()只有讀取了至少一個新的行字符纔會返回。 (對於那些擔心可能存在的緩衝通過nc,這不是一個問題。urlopen()將阻塞,直到它看到的第一個新行字符)。

所以應該注意的是,urlopen()將阻塞,直到接收到第一個換行符之後,可以從連接中讀取數據。實際上,HTTP響應是簡短的多行響應,因此urlopen()應該很快返回。