python 生成器 Package 器可以用来限制方法调用的速率吗?

bz4sfanl  于 2023-02-02  发布在  Python
关注(0)|答案(2)|浏览(141)

假设我有一个在循环中被反复调用的方法。

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):
    ...

我面临的问题是我不知道如何在当前的方法中保持状态(例如已经过去的时间量或发送的电子邮件数量)。我将非常感谢任何关于如何解决这个问题的建议或想法。

f0ofjuux

f0ofjuux1#

您可能正在查找time.sleep()
1.产出一个对象
1.睡眠
1.从步骤1开始重复
例如:

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)
jdgnovmf

jdgnovmf2#

只需使用time.sleep,它将在给定的秒数内挂起当前线程。

相关问题