模块 sched 实现了一个时间调度器,可以在指定的时间执行任务。初始化调度器使用 scheduler(time, delay),它根据函数 time 确定当前时间,然后使用函数 delay等待一定的时间间隔。实际的时间单位不一定是真实的,这样会使接口更灵活,能适应不同的情况。
调用函数 time 不传任何参数,只是返回当前时间的一个数字。函数 delay 接收一个整数参数,单位大小和 time 一样。 例如传2,就要等待和 time 相同的时间单位2。
例子
事件(Events)可以指定一段时间后执行,或者在指定的时间执行。使用 scheduler 初始化调度器之后,使用 enter() 方法执行,传入四个参数:
- delay 一个等待的数字
- priority 优先级
- function 调用的函数
- tuple 传入函数的元组
下面的例子在2秒之后运行一个事件,打印经过了多少时间。
执行:
事件为什么推迟
调用 run() 方法后,默认会阻塞当前线程,因为所有的调度事件都是运行在相同的线程上,所以当一个事件花费的时间比较长时,一些事件可能就会推迟执行。
执行:
第二个事件等第一个事件结束后才开始运行,因为第一个事件结束时已经晚了。所以第二个事件开始时就超过了设置的时间。
事件的优先级
如果多个事件同时运行,则根据他们的优先级来决定运行的顺序。
执行:
本例使用 enterabs() 方法在指定的时间运行事件,两个事件的执行时间一样。因为第二个事件的优先级高,所以先执行。
取消事件
enter() 和 enterabs() 都会返回一个事件对象,都是可以取消的。由于调用 run()后当前线程会阻塞,所以需要在不同的线程内取消事件。
执行:
本例是在另一个线程开启事件调度,然后主线程取消了第一个事件,最后只打印了第二个事件执行的结果。