如果您需要訪問這些低級別屬性使用的插座上,你就必須重載一些對象。
首先,你需要創建的HTTPHandler一個子類,在標準庫做:
class HTTPHandler(AbstractHTTPHandler):
def http_open(self, req):
return self.do_open(httplib.HTTPConnection, req)
http_request = AbstractHTTPHandler.do_request_
正如你所看到的,它採用了HTTPConnection
打開連接......你必須以覆蓋它;)升級connect()
方法。
像這樣的東西應該是一個良好的開端:
class LowLevelHTTPConnection(httplib.HTTPConnection):
def connect(self):
httplib.HTTPConnection.connect(self)
self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
class LowLevelHTTPHandler(HTTPHandler):
def http_open(self, req):
return self.do_open(LowLevelHTTPConnection, req)
的urllib2是足夠聰明,讓你繼承了一些處理,然後用它的urllib2.build_opener針對本作:
urllib2.install_opener(urllib2.build_opener(LowLevelHTTPHandler)) # tell urllib2 to use your HTTPHandler in replacement of the standard HTTPHandler
httpRequest = urllib2.Request("http:/www....com")
pageContent = urllib2.urlopen(httpRequest)
pageContent.readline()
調用Web服務器時,你爲什麼把它??? – jgauffin
我在特定時間輪詢一個網站,當時應該發佈一些信息。速度非常重要,因此設置TCP_NODELAY可避免在發送數據包之前將小部分數據累積到更大的部分。 –
*什麼*'小部分數據'? HTTP請求幾乎肯定會在單個send()中由庫來刷新,並由TCP作爲單個數據包發送。並且在您的最後設置TCP_NODELAY不會改變對端發送響應的方式。不是一個真正的問題。 – EJP