让我说我有类似
的东西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):
???
问题是我不知道如何在这种形式中保存状态(在已发送的时间/发送电子邮件的意义上)。
有没有人有任何想法?
答案 0 :(得分:1)
您可能正在寻找time.sleep()
:
例如:
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
,这将暂停当前线程达到给定的秒数。