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

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

Вот пример и моя попытка:

import queue
import time
import threading
import schedule

def job(name):
    print(name)


def worker_main():
    while 1:
        (job_func,job_msg) = jobqueue.get()
        job_func(job_msg)
        jobqueue.task_done()


name = ['jane', 'alice', 'mary']
jobqueue = queue.Queue()

schedule.every(2).seconds.do(jobqueue.put, (job, name))

worker_thread = threading.Thread(target=worker_main)
worker_thread.start()

while 1:
    schedule.run_pending()
    time.sleep(1)

К сожалению, этот подход запускает одно задание для всех элементов в списке вместе. У кого-нибудь есть предложения? Спасибо.

3
iEriii 2 Май 2021 в 23:13

1 ответ

Лучший ответ

Печать каждого имени через каждые 2 секунды:

for n in name:
    schedule.every(2).seconds.do(jobqueue.put, (job, n))
[Second 2]: jane
[Second 2]: alice
[Second 2]: mary
[Second 4]: jane
[Second 4]: alice
[Second 4]: mary

Печать одного имени через каждые 2 секунды и просмотр списка:

from itertools import cycle
name_iter = cycle(name)
schedule.every(2).seconds.do(lambda: jobqueue.put((job, next(name_iter))))
[Second 2]: jane
[Second 4]: alice
[Second 6]: mary
[Second 8]: jane
[Second 10]: alice
[Second 12]: mary

Что делать, если я не хочу использовать цикл, но останавливаюсь, когда итератор израсходован

Похоже, вы можете поднять schedule.CancelJob https: //schedule.readthedocs.io/en/stable/examples.html#run-a-job-once

name_iter = iter(name)
def queue_name():
    try:
        jobqueue.put((job, next(name_iter)))
    except StopIteration:
        return schedule.CancelJob

schedule.every(1).seconds.do(queue_name)
1
flakes 2 Май 2021 в 22:24