python任务定时运行库 schedule 模块

本文介绍了一款轻量级的Python定时任务运行库,提供了丰富的调度选项,如每10分钟、每小时、每天特定时间等。文章还探讨了如何通过线程和队列实现任务的并行执行,以及如何处理一次性任务、任务取消、随机间隔任务和异常处理。

简介

轻量级的python任务定时运行库--官方文档

使用示例

import schedule
import time

def job():
    print("I'm working...")

def job1(name):        #带参数
    print(name)

schedule.every(10).minutes.do(job)              #每10分钟执行一次
schedule.every().hour.do(job)                   #每小时执行一次  
schedule.every().day.at("10:30").do(job)        #每天10:30执行一次  
schedule.every().monday.do(job)                 #每周星期一执行一次
schedule.every().wednesday.at("13:15").do(job)  #每周星期三执行一次
schedule.every().wednesday.at("13:15").do(job1,'waiwen')  #传入参数

while True:
    schedule.run_pending()
    time.sleep(1)
复制代码

相关问题:

1.如何并行执行工作?

假如每10分钟运行50个任务,每个任务耗时1分钟,这样在下一个10分钟到来时,上一轮的任务仍在运行,然后又开始了新一轮的任务。解决这个问题的方法是,为每个任务创建一个线程,让任务在线程中运行,从而并行工作。

import threading
import time
import schedule

def job():
    print("I'm running on thread %s" % threading.current_thread())

def run_threaded(job_func):
    job_thread = threading.Thread(target=job_func)
    job_thread.start()

schedule.every(10).seconds.do(run_threaded, job)
schedule.every(10).seconds.do(run_threaded, job)

while 1:
    schedule.run_pending()
    time.sleep(1)
复制代码

2.使用队列?

使用queue队列共享,使用多个 worker_thread。

import Queue
import time
import threading
import schedule


def job():
    print("I'm working")

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

jobqueue = Queue.Queue()

schedule.every(10).seconds.do(jobqueue.put, job)
schedule.every(10).seconds.do(jobqueue.put, job)
schedule.every(10).seconds.do(jobqueue.put, job)
schedule.every(10).seconds.do(jobqueue.put, job)
schedule.every(10).seconds.do(jobqueue.put, job)

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

while 1:
    schedule.run_pending()
    time.sleep(1)
复制代码

3.只运行一次任务?

def job_that_executes_once():
    # Do some work ...
    return schedule.CancelJob

schedule.every().day.at('22:30').do(job_that_executes_once)
复制代码

4.取消任务?

def greet(name):
    print('Hello {}'.format(name))

schedule.every().day.do(greet, 'Andrea').tag('daily-tasks', 'friend')
schedule.every().hour.do(greet, 'John').tag('hourly-tasks', 'friend')
schedule.every().hour.do(greet, 'Monica').tag('hourly-tasks', 'customer')
schedule.every().day.do(greet, 'Derek').tag('daily-tasks', 'guest')

schedule.clear('daily-tasks')
复制代码

5.随机间隔内运行任务?

def my_job():
# This job will execute every 5 to 10 seconds.
print('Foo')

schedule.every(5).to(10).seconds.do(my_job)
复制代码

6.如何抛出异常?

模块不会主动抛出异常,但是可以使用装饰器捕获目标任务的异常。

import functools

def catch_exceptions(job_func, cancel_on_failure=False):
    @functools.wraps(job_func)
    def wrapper(*args, **kwargs):
        try:
            return job_func(*args, **kwargs)
        except:
            import traceback
            print(traceback.format_exc())
            if cancel_on_failure:
                return schedule.CancelJob
    return wrapper

@catch_exceptions(cancel_on_failure=True)
def bad_task():
    return 1 / 0

schedule.every(5).minutes.do(bad_task)
复制代码

更详细用法请访问 官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值