Python 线程调度
Python支持在程序中使用多个线程。多线程程序可以独立地执行多个子任务,从而实现任务的并行执行。
Python解释器将Python线程请求映射到POSIX/pthreads或Windows线程。因此,与普通线程类似,Python线程由主机操作系统处理。
然而,Python解释器不支持线程调度。因此,无法使用Python解释器实现线程优先级、调度方案和线程抢占。Python线程的调度和上下文切换取决于主机调度器的处理。
Python确实在标准库中以sched模块的形式提供了一些任务调度的支持。它可以用于创建机器人和其他监控和自动化应用程序。 sched 模块实现了一个通用的事件调度器,用于在指定的时间运行任务。它提供了类似于Windows或Linux中的任务调度器的工具。
调度器类在内置模块 sched 中定义。
scheduler(timefunc=time.monotonic, delayfunc=time.sleep)
调度器类中定义的方法包括:
- scheduler.enter() - 可以安排事件在延迟后运行,或者在特定时间运行。使用enter()方法来安排延迟执行的事件。
-
scheduler.cancel() - 从队列中移除事件。如果事件不在队列中,该方法会引发ValueError错误。
-
scheduler.run(blocking=True) - 运行所有已安排的事件。
可以安排事件在延迟后运行,或者在特定时间运行。要安排延迟执行的事件,请使用enter()方法,该方法接受四个参数。
- 表示延迟的数字
-
优先级值
-
要调用的函数
-
函数的参数元组
示例1
此示例安排了两个不同的事件 –
import sched
import time
scheduler = sched.scheduler(time.time, time.sleep)
def schedule_event(name, start):
now = time.time()
elapsed = int(now - start)
print('elapsed=',elapsed, 'name=', name)
start = time.time()
print('START:', time.ctime(start))
scheduler.enter(2, 1, schedule_event, ('EVENT_1', start))
scheduler.enter(5, 1, schedule_event, ('EVENT_2', start))
scheduler.run()
它将生成以下 输出 −
START: Mon Jun 5 15:37:29 2023
elapsed= 2 name= EVENT_1
elapsed= 5 name= EVENT_2
示例2
让我们来看一个例子来更好地理解这个概念-
import sched
from datetime import datetime
import time
def addition(a,b):
print("Performing Addition : ", datetime.now())
print("Time : ", time.monotonic())
print("Result : ", a+b)
s = sched.scheduler()
print("Start Time : ", datetime.now())
event1 = s.enter(10, 1, addition, argument = (5,6))
print("Event Created : ", event1)
s.run()
print("End Time : ", datetime.now())
将会产生以下的 输出 –
Start Time : 2023-06-05 15:49:49.508400
Event Created : Event(time=774087.453, priority=1, sequence=0, action=<function addition at 0x000001FFE71A1080>, argument=(5, 6), kwargs={})
Performing Addition : 2023-06-05 15:49:59.512213
Time : 774087.484
Result : 11
End Time : 2023-06-05 15:49:59.559659