Python - 线程调度


Python 中的线程调度是决定在任何给定时间运行哪个线程的过程。在多线程程序中,多个线程独立执行,允许并行执行任务。但是,Python 没有直接控制线程优先级或调度策略的内置支持。相反,它依赖于操作系统的线程调度程序。

Python 线程映射到主机操作系统的本机线程,例如类 Unix 系统上的 POSIX 线程 (pthread) 或 Windows 线程。操作系统的计划程序管理这些线程的执行,包括上下文切换、线程优先级和计划策略。Python 通过线程提供基本的线程调度功能。Timer 类和 sched 模块。

在本教程中,将学习 Python 中线程调度的基础知识,包括如何使用 sched 模块来调度任务和线程。用于延迟执行函数的 timer 类。

使用 Timer 类调度线程

Python threading 模块的 Timer 类允许您安排在一定时间后调用函数。此类是 Thread 的子类,用作创建自定义线程的示例。

您可以通过调用计时器的 start() 方法来启动计时器,类似于线程。如果需要,您可以使用 cancel() 方法在计时器开始之前停止计时器。请注意,执行操作之前的实际延迟可能与指定的确切间隔不匹配。

例

此示例演示如何使用线程。Timer() 类来安排和管理 Python 中任务(自定义线程)的执行。


import threading
import time

# Define the event function
def schedule_event(name, start):
	 	now = time.time()
	 	elapsed = int(now - start)
	 	print('Elapsed:', elapsed, 'Name:', name)

# Start time
start = time.time()
print('START:', time.ctime(start))

# Schedule events using Timer
t1 = threading.Timer(3, schedule_event, args=('EVENT_1', start))
t2 = threading.Timer(2, schedule_event, args=('EVENT_2', start))

# Start the timers
t1.start()
t2.start()

t1.join()
t2.join()
# End time
end = time.time()
print('End:', time.ctime(end))

在执行上述程序时,它将产生以下输出 -

START: Tue Jul 2 14:46:33 2024
Elapsed: 2 Name: EVENT_2
Elapsed: 3 Name: EVENT_1
End: Tue Jul 2 14:46:36 2024

使用 sched 模块调度线程

Python 标准库中的 sched 模块提供了一种调度任务的方法。它实现了一个通用的事件调度程序,用于在特定时间运行任务。它提供了类似的工具,例如 Windows 或 Linux 中的任务调度程序。

sched 模块的关键类和方法

scheduler() 类定义在 sched 模块中,用于创建调度器对象。这是类的语法 -


 scheduler(timefunc=time.monotonic, delayfunc=time.sleep)

scheduler 类中定义的方法包括 -

  • scheduler.enter(delay, priority, action, argument=(), kwargs={}) − 事件可以安排在延迟后运行,或者在特定时间运行。要延迟调度它们,请使用 enter() 方法。
  • scheduler.cancel(event) − 从队列中删除事件。如果事件不是队列中的当前事件,则此方法将引发 ValueError。
  • scheduler.run(blocking=True) − 运行所有定时事件。

可以将事件安排在延迟后运行,也可以安排在特定时间运行。要以延迟计划它们,请使用 enter() 方法,该方法需要四个参数。

  • 表示延迟的数字
  • 优先级值
  • 要调用的函数
  • 函数的参数元组
例

此示例演示如何使用 sched 模块将事件安排为在延迟后运行。它安排了两个不同的事件 -


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()

# End time
end = time.time()
print('End:', time.ctime(end))

它将产生以下输出 -

START: Tue Jul 2 15:11:48 2024
elapsed= 2 name= EVENT_1
elapsed= 5 name= EVENT_2
End: Tue Jul 2 15:11:53 2024

例

让我们再举一个例子来更好地理解这个概念。此示例使用 Python 中的 sched 模块安排一个函数在 4 秒延迟后执行加法。


import sched
from datetime import datetime
import time

def addition(a,b):
	 	print("Performing Addition : ", datetime.now())
	 	print("Time : ", time.monotonic())
	 	print("Result {}+{} =".format(a, b), a+b)

s = sched.scheduler()

print("Start Time : ", datetime.now())

event1 = s.enter(4, 1, addition, argument = (5,6))
print("Event Created : ", event1)
s.run()
print("End Time : ", datetime.now())

它将产生以下输出 -

Start Time : 2024-07-02 15:18:27.862524
Event Created : Event(time=2927111.05638099, priority=1, sequence=0, action=<function addition at 0x7f31f902bd90>, argument=(5, 6), kwargs={})
Performing Addition : 2024-07-02 15:18:31.866381
Time : 2927111.060294749
Result 5+6 = 11
End Time : 2024-07-02 15:18:31.866545