簡體   English   中英

Python request.get持續超時約一分鍾,然后繼續正常工作

[英]Python requests.get keeps getting timed out for about a minute, then continues working normally

我已經嘗試解決此問題大約一個星期了。 我可能錯過了確實很明顯的東西,或者問題出在API的服務器端,或者服務器故意使我停滯了(我用python編碼)。

我正在嘗試做的是:

  1. 我正在嘗試獲取財務數據(更好地了解所有市場的市場深度)。 問題在於交換服務的api僅支持僅針對一個市場獲取數據(總計大約75-85,可變),因此我決定為每個市場啟動一個線程
  2. 每個線程將處理一個市場,如果成功返回,則嘗試獲取該市場的數據,如果沒有成功,則將市場重新添加到隊列中,以供稍后新線程處理
  3. 這樣做直到覆蓋所有市場,然后無限重復以保持數據為最新。

我使用請求庫在python中對此進行了編碼。 經過幾次迭代,它仍然可以正常工作,但是服務器停止響應。 為了克服這個問題,我在request.get中添加了超時。 它超時,但是服務器在大約1分鍾內也沒有響應新查詢。 然后,一切又可以順利進行幾次迭代,然后停頓,然后重復一次。

這是python代碼。

import requests, json
import thread, threading
from time import sleep, clock


#Get queue
conn = requests.get('http://data.bter.com/api/1/pairs/')
mainQueue = json.loads(conn.content)
conn.close()


#Variable globals
marketCount = 0
queue = mainQueue[:]


#Static globals
lock = threading.Lock()
completeSize = len(queue)


def getOrderData(marketid):
    global queue, marketCount

    try:
        data = requests.get(str('http://data.bter.com/api/1/depth/'
                                +marketid), timeout = 3)
    except:
        with lock:
            print "Timed out: %s" % marketid
            queue.append(marketid)
        return

    with lock:
        marketCount += 1
        data.close()
    return


while True:
    print "##################################"

    #Initialize data
    crT = clock()
    marketCount = 0
    queue = mainQueue[:]


    #Start retrieving all markets
    while marketCount != completeSize:
        while len(queue) == 0 and marketCount != completeSize:
            sleep(0.01)

        if marketCount != completeSize:
            marketid = queue.pop(0)
            thread.start_new_thread(getOrderData, (marketid,))

    #Print time spent
    print "Finished, total time:",clock()-crT
    sleep(1)

這是程序在運行時的行為方式。 這是程序在運行時的行為方式。

“完成”表示我一次獲得了所有財務數據,並開始再次對其進行更新。 如您所見,似乎一切正常,然后開始停頓,超時。 突然,事情又開始正常工作了。 我還注意到,在關閉與data.close()的連接后,狀態為TIME_WAIT的tcp連接將在tcp監視程序中保留很長時間。 經過幾次迭代后,其中有大量TONS,僅在TIME_WAIT狀態下等待。

所以,這是我的問題

  1. 在所有保持TIME_WAIT狀態的TCP連接中,是否有可能正在等待服務器發送某種信號來釋放它們? 如果是這樣,服務器是否可能因為我一次有太多(活動?活動?)連接而停止響應我?
  2. 如果不是,那為什么所有我的get請求都保持超時的停滯期發生了? 是因為服務器可能會對每個客戶端每分鍾的查詢有限制嗎? 等到大約一分鍾后,它又神奇地恢復正常工作,
  3. 我有TONS和TONS的TCP連接處於TIME_WAIT狀態,它們不斷積累。 (我每秒大約啟動80個連接。如果要完全釋放連接需要4分鍾,那將是累積19200個連接)如何解決這個問題,這根本不是問題嗎?
  4. 我開始了很多線程。 這是個問題嗎?
  5. 以線性方式獲取所有數據是不可能的,一個市場一個接一個,太慢了,數據將過時。 我可以通過其他任何方式使整個市場數據保持最新狀態嗎(最長3秒年齡)
  6. 您還有什么要告訴我的嗎?

我知道我的代碼還沒有保存數據。 我只是想先得到它。 代碼不好,但是因為我正在測試一個簡短的片段,所以我沒有理會注釋(我改變了很多次,試圖找到一種方法)

提前致謝。 我真的希望我能克服這個困難。

您正在非常頻繁地執行請求,這很可能是服務器不允許的。 他們可能使用的技術稱為調節 ,請訪問http://www.django-rest-framework.org/api-guide/throttling ,他們對此有很好的解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM