如何解决python schedule - 来自python列表的作业
我想使用 python schedule library 来安排大量作业。
所有作业执行相同的操作,但使用不同的输入。
输入存储在 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)
不幸的是,这种方法对列表中的所有项目一起运行 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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。