在 Python 中,目前 threading 模块不直接支持线程优先级。与 Java 不同,Python 不支持线程优先级、线程组或某些线程控制机制,例如销毁、停止、暂停、恢复或中断线程。
甚至认为 Python 线程设计简单,并且松散地基于 Java 的线程模型。这是因为 Python 的全局解释器锁 (GIL) 管理 Python 线程。
但是,您可以使用诸如休眠持续时间、线程中的自定义计划逻辑等技术或使用管理任务优先级的附加模块来模拟基于优先级的行为。
使用 sleep() 设置线程优先级
您可以通过引入延迟或使用其他机制来控制线程的执行顺序来模拟线程优先级。模拟线程优先级的一种常见方法是调整线程的休眠持续时间。
优先级较低的线程睡眠时间较长,优先级较高的线程睡眠时间较短。
例这是一个简单的示例,用于演示如何使用 Python 线程中的延迟自定义线程优先级。在此示例中,Thread-2 在 Thread-1 之前完成,因为它的优先级值较低,从而导致睡眠时间更短。
输出
在执行上述程序时,您将获得以下结果 -
Thread-1 thread with priority 4 is running
All Threads are executed
在 Windows 上调整 Python 线程优先级
在 Windows 操作系统上,您可以使用 ctypes 模块操作线程优先级,这是用于与 Windows API 交互的 Python 标准模块之一。
例此示例演示如何在 Windows 系统上使用 ctypes 模块在 Python 中手动设置线程的优先级。
输出
在 Python 解释器中执行此代码时,您将获得以下结果 -
normal running
high running
normal running
high running
normal running
high running
normal running
使用 queue 模块确定 Python 线程的优先级
Python 标准库中的 queue 模块在线程编程中非常有用,当必须在多个线程之间安全地交换信息时。此模块中的 Priority Queue 类实现了所有必需的锁定语义。
使用优先级队列时,条目将保持排序(使用 heapq 模块),并首先检索值最低的条目。
Queue 对象具有以下方法来控制 Queue -
- get() − get() 从队列中删除并返回一个项目。
- put() − put 将项目添加到队列中。
- qsize() − qsize() 返回当前队列中的项目数。
- empty() − 如果队列为空,则 empty( ) 返回 True;否则为 False。
- full() − 如果队列已满,则 full() 返回 True;否则为 False。
这是优先级队列的构造函数。maxsize 是一个整数,用于设置可放入队列中的项数的上限。如果 maxsize 小于或等于零,则队列大小为无限大。
首先检索最低值的条目(最低值的条目是 min(entries) 返回的条目)。条目的典型模式是 -
例
此示例演示了如何使用 queue 模块中的 PriorityQueue 类来管理两个线程之间的任务优先级。
输出
在执行时,它将产生以下输出 -
Consumer: Running
(0, 0.15332707626852804)
(2, 0.4730737391435892)
(2, 0.8679231358257962)
(3, 0.051924220435665025)
(4, 0.23945882716108446)
Producer: Done
Consumer: Done