小编典典

如何在Python中限制对Web服务的请求速率?

python

我正在研究与Web服务API交互的Python库。就像我遇到的许多Web服务一样,这一请求限制了请求的速度。我想limit为类实例提供一个可选参数,如果提供的话,它将保留传出的请求,直到经过指定的秒数为止。

我知道一般情况如下:类的实例通过方法发出请求。完成后,该方法会发出一些在某个位置设置锁定变量的信号,并启动倒数计时器,以秒为单位limit。(锁定很可能是倒数计时器本身。)如果在此时间段内发出另一个请求,则该请求必须排队,直到倒数计时器达到零并且解除锁定为止。此时,将发送队列中最旧的请求,并重置倒数计时器并重新启用锁。

这是线程的情况吗?我还有其他方法吗?

倒数计时器和锁应该是实例变量,还是应该属于该类,以便该类的所有实例都可以保存请求?

另外,在库中提供速率限制功能通常不是一个好主意吗?我的理由是,由于默认情况下倒计时为零秒,因此该库仍允许开发人员使用该库并提供自己的速率限制方案。但是,考虑到使用该服务的任何开发人员无论如何都需要对请求进行速率限制,因此我认为对于图书馆而言,提供速率限制的方式将很方便。

无论是否在库中放置一个限速方案,我都希望使用该库编写一个应用程序,因此建议的技术将派上用场。

非常感谢您的建议!

克里斯


阅读 210

收藏
2021-01-20

共1个答案

小编典典

使用队列和调度程序可以更好地解决问题。

您将处理分为两个方面: sourcedispatch 。这些可以是单独的线程(如果更容易,也可以是单独的进程)。

端创建,并在任何速率排队,请求让他们高兴。

调度 方面做到这一点。

  1. 获取请求的开始时间 s

  2. 使请求出队,通过远程服务处理请求。

  3. 获取当前时间 t 。睡眠 - ( 牛逼 - 小号 )秒。

如果要运行直接连接到远程服务的“ 源” 端,则可以这样做,并绕过速率限制。这对于使用远程服务的模拟版本进行内部测试非常有用。

困难的部分是为您可以排队的每个请求创建一些表示。由于Python
Queue几乎可以处理任何事情,因此您无需做太多事情。

如果使用多处理,则必须腌制对象才能将它们放入管道中。

2021-01-20