我正在使用Python http.client.HTTPResponse.read()
從流中讀取數據。也就是說,服務器永遠保持連接打開,並在數據可用時定期發送數據。沒有預期的響應時間。特別是,我通過Twitter Streaming API收到推文。當沒有數據時,是否可以阻止python的http.client.HTTPResponse.read()掛起?
爲了達到這個目的,我一再呼叫http.client.HTTPResponse.read(1)
得到響應,一次一個字節。問題在於,如果沒有要讀取的數據,程序將掛在該行上,而這段時間並不是很長時間(當沒有Tweets進入時)。
我正在尋找一種方法,將獲得HTTP響應的單個字節(如果可用),但如果沒有數據要讀取,則會立即失敗。
我已經read that you can set a timeout when the connection is created,但是在連接上設置超時會導致打開很長時間等待數據進入的全部目的。我不想設置超時,我想要讀取數據是否有數據要讀取,如果沒有數據則失敗,沒有等待。
我想用我現在使用的(使用http.client
)來做到這一點,但如果它是絕對有必要我使用不同的庫來做到這一點,那就這樣吧。我試圖完全自己寫這篇文章,所以建議我使用別人已經編寫好的用於Python的Twitter API並不是我正在尋找的東西。
此代碼獲取響應時,它在一個單獨的線程從主一個運行:
while True:
try:
readByte = dc.request.read(1)
except:
readByte = []
if len(byte) != 0:
dc.responseLock.acquire()
dc.response = dc.response + chr(byte[0])
dc.responseLock.release()
注意,請求存儲在dc.request
和dc.response
響應,這些在別處創建。 dc.responseLock
是一個Lock
,它可以防止dc.response
一次被多個線程訪問。
由於它在單獨的線程上運行,因此主線程可以獲得dc.response
,其中包含到目前爲止收到的全部響應。新數據在不阻塞主線程的情況下被添加到dc.response
。
這完美的作品時,它的運行,但我遇到一個問題時,我希望它停止。我改變了我的while語句爲while not dc.twitterAbort
,所以當我想中止這個線程時,我只是將dc.twitterAbort
設置爲True
,並且線程將停止。
但它沒有。此線程在此之後很長一段時間,堅持在dc.request.read(1)
部分。必須有某種超時,因爲它最終會返回到while
語句並停止該線程,但發生這種情況大約需要10秒。
如何在我想要的時候讓我的線程立即停止,如果它卡在read()
的電話上?
同樣,這種方法正在得到鳴叫,問題只在它前往停止。如果我以完全錯誤的方式回答這個問題,請隨時指出我的方向。我是Python的新手,所以我可能忽略了一些更簡單的方法來解決這個問題。