Python:限制脚本的多次执行

时间:2018-05-28 05:28:11

标签: python rate-limiting

我正试图找到一种方法来限制个别线程。多次调用相同的脚本,将后续执行排队或限制到定义的参数内。

我发现了很多多处理和多线程解决方案,但这些解决方案适用于单个脚本执行。我不确定如何处理这个单独执行相同的脚本。

我的目标是将线程执行次数限制为每秒二十(20)次。等待或排队后续执行,并继续基于FIFO进行处理。

为了测试,我们将约束设置为每分钟三(3)。不确定从哪里开始,只显示rate_limit()作为占位符。

import time

rate = 60
limit = 3

ts = time.time()

def single_task():
    print ts

rate_limit(single_task())

多次执行的结果应如下所示:

session_1$ ./script.py 
1527483557.76

session_2$ ./script.py 
1527483558.26

session_3$ ./script.py 
1527483559.03

session_4$ ./script.py
hang on a minute... 
1527483560.57 

session_5$ ./script.py 
hang on a minute... 
1527483561.92

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,并编写了一个小python软件包(mp_throttle)来限制和监视多个线程或进程。您可以通过pip install mp_throttle安装它。您可以使用速率限制将其实例化,然后将节流对象处理到线程中。然后使用.await_fuel()根据限制阻止线程。

import mp_throttle
import threading
import time

def single_task(throttle):
    while not throttle.kill_flag.is_set():
        throttle.await_fuel()
        print("{}: executed at: {}".format(threading.currentThread().name, time.time()))
    return

throttle = mp_throttle.Throttle(3,60)

for i in range(5):
    t = threading.Thread(target=single_task, args=(throttle,), daemon=True)
    t.start()

throttle.start()
time.sleep(40)
throttle.stop()

这将输出如下内容:

Thread-1: executed at: 1534428994.0086124
Thread-2: executed at: 1534429014.013284
Thread-3: executed at: 1534429034.0338206

取决于任务的类型(常规执行时间与非常规执行时间),系统(最小睡眠时间和睡眠精度)和速率(速率越高,精度越低),可能需要进行一些设置和校准。进一步了解docs