Python: ограничение скорости нескольких исполнений скрипта - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь найти способ ограничения скорости отдельных тем.Вызов одного и того же сценария несколько раз, постановка в очередь или регулирование последующих выполнений в пределах определенных параметров.

Я обнаружил множество решений для многопроцессорной обработки и многопоточности, но они применимы к одному выполнению сценария.Я не уверен, как справиться с этим для отдельных исполнений одного и того же сценария . .

Моя цель - ограничить число выполнений потоков до двадцати (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 голосов
/ 16 августа 2018

Я столкнулся с подобной проблемой и написал небольшой пакет 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

В зависимости от типа задач (обычное или нерегулярное время выполнения), ваша система (минимальное время сна и точность сна) и скорость (более высокие скорости менее точны), некоторые настройки и калибровка могут быть необходимы.Взгляните на документы , чтобы узнать больше.

...