2017-02-21 29 views
1

當我使用使10個請求

requests.get() 

一次又一次地調用相同的服務器,但我限制在每分鐘30名的請求Python的睡眠。當我提出30個請求時,如何讓程序進入睡眠狀態一分鐘。挑戰是

requests.get() 

無處不在我的代碼中,我不能把它們放在一個循環中。

+0

'time.sleep(60)'...... –

回答

0

您可以使用Adapter Pattern來包裝請求。像這樣的:

class RequestLimiter: 
    def __init__(self): 
     self.count = 0 
    def get(self, *args, **kwargs): 
     if self.count == 30: 
      time.sleep(60) 
      self.count = 0 
      return requests.get(*args, **kwargs) 
     else: 
      self.count += 1 
      requests.get(*args, **kwargs) 

def main(): 
    # If this is through your whole program, 
    # you might want to make this global- be careful with that! 
    r = RequestLimiter() 
    r.get(url, args) 

根據您的要求,你可能想要改變一些。例如,在編碼時,無論您的get成功或失敗,您的次數都會增加。這可能是也可能不是你想要的。如果您決定創建此類的全局實例,那麼您必須擔心併發訪問count變量(如果您使用的是併發性)。

+0

儘管您的代碼在睡眠前將請求數量限制爲30,但這與僅允許每分鐘30分鐘不一樣。我相信它需要一些真正做OP的需求之間的時間間隔。 – martineau

+0

@馬蒂諾,OP的原始問題確實要求在每30次請求後如何睡一分鐘。我發佈此代碼是最簡單的方法。不過,我同意,這不是限制請求的最省時方法。如果我有時間,我會嘗試使用間隔方法在今晚發佈另一個答案。 – Ben

+0

我並不是說你的工作效率不高,只是需要計算每分鐘的請求數量才能真正做好OP的工作。另外,它可能還需要檢查是否正在進行相同的請求,並相應地進行調整或重置。 – martineau