Python自带一个调度器模块sched,可以为你实现优先级队列/延迟队列和定时队列。这个模块的使用非常简单。首先以延迟队列为例:importscheddefdo_work(name):print(f'Hello:{name}')sch=sched.scheduler()sch.enter(5,1,do_work,argument=('kingname',))sch.run()代码运行后会卡在sch.run(),5秒后执行do_work('kingname')。运行效果如下图所示:其中,sch.enter()的第一个参数是延迟时间,单位秒,第二个参数是优先级,数字越小,优先级越高。当两个任务同时执行时,优先级高的先执行。但是需要注意的是,如果这样写:importscheddefdo_work(name):print(f'Hi:{name}')sch=sched.scheduler()sch.enter(5,2,do_work,argument=('productManager',))sch.enter(5,1,do_work,argument=('kingname',))sch.run()然后首先打印出来的是你好:产品经理,如下图:Whyis这里的优先级无效?1的优先级大于2,下面应该先运行。这是因为仅当两个任务同时运行时才会检查优先级。如果两个任务相继触发,还没到比较优先级的时候。由于延迟队列的延迟是相对于这行代码的当前运行时间来计算的,下一行代码比上一行代码晚了几毫秒,所以实际上产品经理的行会到达时间第一,所以它会先运行。为了使用绝对精确的时间,我们可以使用另一种方法:importschedimporttimeimportdatetimedefdo_work(name):print(f'Hello:{name}')sch=sched.scheduler(time.time,time.sleep)start_time=datetime.datetime。now()+datetime.timedelta(seconds=10)start_time_ts=start_time.timestamp()sch.enterabs(start_time_ts,2,do_work,argument=('产品经理',))sch.enterabs(start_time_ts,1,do_work,参数=('kingname',))sch.run()的效果如下图所示:sch.enterabc()的第一个参数是任务开始时间的时间戳,是一个绝对时间,datetime可以这个时候可以使用Module来生成,或者你熟悉的其他方法。以下参数与sch.enter()完全相同。如果你要运行的函数有多个参数或者默认参数,你可以通过以下方式传入参数:importschedimporttimeimportdatetimedefdo_work(name,place,work='writecode'):print(f'Hello:{name},You位于:{place}{work}')sch=sched.scheduler(time.time,time.sleep)start_time=datetime.datetime.now()+datetime.timedelta(seconds=10)start_time_ts=start_time.timestamp()sch.enter(5,2,do_work,argument=('产品经理','杭州'),kwargs={'work':'写需求文档'})sch.enterabs(start_time_ts,1,do_work,argument=('kingname','产品经理旁边'),kwargs={'work':'在看她'})sch.run()的argument参数对应的tuple存储普通参数,kwargs对应的字典存储带有参数名称的参数。
