url = "http://example.com/file.xml"
data = urllib2.urlopen(url)
data.read()
現在的問題是,什麼時候該文件從網上下載?當我做urlopen或.read()?在我的網絡接口上,我看到兩次都有很高的流量。何時urllib2實際上從網址下載文件?
url = "http://example.com/file.xml"
data = urllib2.urlopen(url)
data.read()
現在的問題是,什麼時候該文件從網上下載?當我做urlopen或.read()?在我的網絡接口上,我看到兩次都有很高的流量。何時urllib2實際上從網址下載文件?
不用其他看代碼,我期望會發生以下情況:
urlopen()
打開連接,並將查詢。然後服務器開始提供回覆。此時,數據在緩衝區中累積,直到它們已滿並且操作系統告訴服務器保持一段時間。data.read()
清空緩衝區,所以操作系統會通知服務器繼續運行,並回復其餘部分。當然,如果回覆足夠短,或者.read()
發生得足夠快,那麼緩衝區沒有時間填滿並且下載一次發生。
我同意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()
應該很快返回。
感謝您快速回答 – user20955 2008-10-21 20:36:09