Python: продолжает удерживать вызов метода до настроенного времени задержки - PullRequest
0 голосов
/ 16 апреля 2019

Из другого потока / интерфейса мой класс получает работу, мой класс должен обрабатывать работу с настроенным временем задержки.

def getJob(job):

    work = self._getNextWorkToRun(job)
    if work is None:
        return {}
    #proceed to do work

job отправляет другим пакетом в этот класс. Я хотел вызывать метод _getNextWorkToRun() каждые пять минут только один раз. но работа приходит каждую секунду / меньше секунды. Поэтому мне нужно подождать до 5 минут, чтобы снова позвонить _getNextWorkToRun() с новой работой. Каждое задание имеет ссылку (JOB1, JOB2 ... и т. Д.), И все задания должны быть выполнены с задержкой в ​​5 минут.

Каков наилучший способ добиться этого?

1 Ответ

0 голосов
/ 22 апреля 2019

ниже является примером использования потоков, задания будут добавляться в любое время в очередь заданий из любой другой функции, а функция get_job () будет непрерывно запускать мониторинг заданий и обрабатывать их с фиксированным интервалом, пока не будет получен флаг остановки

from threading import Thread
from queue import Queue
import time
from random import random

jobs = Queue()  # queue safely used between threads to pass jobs
run_flag = True

def job_feeder():
    for i in range(10):
        # adding a job to jobs queue, job could be anything, here we just add a string for simplicity
        jobs.put(f'job-{i}')  
        print(f'adding job-{i}')
        time.sleep(random())  # simulate adding jobs randomly
    print('job_feeder() finished')

def get_job():
    while run_flag:
        if jobs.qsize():  # check if there is any jobs in queue first
            job = jobs.get()  # getting the job
            print(f'executing {job}')
        time.sleep(3)
    print('get_job finished')

t1 = Thread(target=job_feeder)
t2 = Thread(target=get_job)

t1.start()
t2.start()

# we can make get_job() thread quit anytime by setting run_flag
time.sleep(20)
run_flag = False

# waiting for threads to quit
t1.join()
t2.join()

print('all clear')

выход:

adding job-0
executing job-0
adding job-1
adding job-2
adding job-3
adding job-4
adding job-5
adding job-6
adding job-7
executing job-1
adding job-8
adding job-9
job_feeder() finished
executing job-2
executing job-3
executing job-4
executing job-5
executing job-6
get_job finished
all clear

note Примечание get_job () обработал только 6 заданий, потому что мы посылаем сигнал выхода через 20 секунд

...