我正试图找到一种方法来限制个别线程。多次调用相同的脚本,将后续执行排队或限制到定义的参数内。
我发现了很多多处理和多线程解决方案,但这些解决方案适用于单个脚本执行。我不确定如何处理这个单独执行相同的脚本。
我的目标是将线程执行次数限制为每秒二十(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
答案 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。