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