2015-11-03 83 views
0

我簡化了我想要實現儘可能 我有以下腳本:爲Python線程計算平均睡眠

import time, urllib, random 
import threading 

def get(timeout): 
    for i in range(2): 
     time.sleep(timeout) 
     return urllib.urlopen('http://localhost:9855').read() 

def calculate_timeout(total_threads): 
    pass 

if __name__ == '__main__': 
    total = random.randint(0,400) 
    for i in xrange(total): 
     threading.thread(target=get, kwargs={"timeout":calculate_timeout(len(total)}).start() 

我需要做的就是修改這樣的calculate_timeout功能這樣一來,無論隨機數是多少, 平均每分鐘不會有超過60個urllib請求。

回答

0

有一大堆限速算法發佈here包括線程代碼的例子,這是我在下面發佈的最簡單的'imo'。該代碼將創建一個裝飾器,然後您可以用它來裝飾您的get方法。

import time 
import threading 

from functools import wraps 


def rate_limited(max_per_second): 
    """ 
    Decorator that make functions not be called faster than 
    """ 
    lock = threading.Lock() 
    min_interval = 1.0/float(max_per_second) 

    def decorate(func): 
     last_time_called = [0.0] 

     @wraps(func) 
     def rate_limited_function(*args, **kwargs): 
      lock.acquire() 
      elapsed = time.clock() - last_time_called[0] 
      left_to_wait = min_interval - elapsed 

      if left_to_wait > 0: 
       time.sleep(left_to_wait) 

      lock.release() 

      ret = func(*args, **kwargs) 
      last_time_called[0] = time.clock() 
      return ret 

     return rate_limited_function 

    return decorate