限速发电机包装?

时间:2016-05-27 05:34:40

标签: python python-3.x

让我说我有类似

的东西
for user in users:
     send_email(user)

但是既然我想减少拥堵,我想要像

这样的东西
for user in rate_limit(per_min=50, users):
     send_email(user)

rate_limit函数只是在达到速率限制后再次睡眠并开始从users开始产生。

# something like this, where it just sleeps (until next min/sec cycle) 
# once the number of iterations per_min or per_sec have been achieved.

def rate_limit(per_min=None, per_sec=None, objects):
    ???

问题是我不知道如何在这种形式中保存状态(在已发送的时间/发送电子邮件的意义上)。

有没有人有任何想法?

2 个答案:

答案 0 :(得分:1)

您可能正在寻找time.sleep()

  1. 产生一个物体
  2. 睡眠
  3. 从第1步开始重复
  4. 例如:

    import time
    
    def rate_limit(objects, per_min=None):
        sleep_time = 60 / per_min if per_min else 0
        for obj in objects:
            yield obj
            time.sleep(sleep_time)
    
      

    问题是我不知道如何以这种形式保存状态(在时间和/已发送电子邮件的意义上)。

    这将自动保留状态,因为yield只是暂停该功能并在再次调用该函数后继续。如果您想知道所花费的时间和发送的邮件数量,您只需添加一个计数器:

    def rate_limit(objects, per_min=None):
        sleep_time = 60 / per_min if per_min else 0
        for count, obj in enumerate(objects):
            yield obj
            print('Sent email {0} at {1} seconds.'.format(count, count * sleep_time))
            time.sleep(sleep_time)
    

答案 1 :(得分:1)

只需使用time.sleep,这将暂停当前线程达到给定的秒数。