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