apscheduler 如何在完成有限个任务后退出

2021-09-16 03:57:47 +08:00
 eccentric579
today = datetime.datetime.now().strf(''%Y-%m-%d'')
scheduler = BlockingScheduler()
scheduler.add_job(job, 'cron', hour = '9-11', minute = '*/5', end_date = day + " 11:35:00", timezone = tz)  
scheduler.start()  
scheduler.shutdown()    

用 blockingscheduler 不会返回
用 background, shutdown 又没有阻塞,直接就结束了

1596 次点击
所在节点    Python
2 条回复
eccentric579
2021-09-16 08:56:41 +08:00
睡了一觉,起来有点思路了。
用 blockingscheduler,那么创建一个检查任务完成就触发异常的 job,用 try 捕捉然后 shutdown
或者用 backgroundsheduler,让主进程检查任务完成,未完成就 sleep

感觉有点像是土办法
princelai
2021-09-16 09:56:06 +08:00
我之前写过类似的,和你思路差不多,外部用一个类记录状态并判断

```python
from apscheduler.executors.pool import ThreadPoolExecutor
from apscheduler.jobstores.memory import MemoryJobStore
from apscheduler.schedulers.background import BlockingScheduler
from loguru import logger


class LimitJob:
n = 0

@classmethod
def print_job(cls):
cls.n += 1
logger.info(f"run job {cls.n} times")
if cls.n >= 5:
jobs.shutdown(wait=False)


def init_scheduler() -> BlockingScheduler:
jobstores = {
'default': MemoryJobStore()
}
executors = {
'default': ThreadPoolExecutor(1)
}
job_defaults = {
'coalesce': False,
'max_instances': 1}

scheduler = BlockingScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults)
scheduler.add_job(LimitJob.print_job, 'interval', seconds=3, id="print_job")
logger.info("调度任务创建成功")
scheduler.print_jobs()
return scheduler


if __name__ == '__main__':
jobs = init_scheduler()
jobs.start()

```

https://pastebin.ubuntu.com/p/XQMtf4RXgp/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/802164

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX