您的位置:

14. Python 中的threading模块

Python 中的threading模块

更新:

正如我们在之前的教程中所看到的,threading模块用于在 python 中创建、控制和管理线程。在本教程中,我们将讨论由threading模块定义的各种函数和对象类型。


threading模块功能

该模块提供以下管理线程的功能:

这是上一个教程的代码片段,我们将使用它来查看threading模块提供的各种功能。

穿线。active_count()功能

该函数返回当前活动的Thread对象的数量。

import time
import threading

def thread1(i):
    time.sleep(3)
    #print('No. printed by Thread 1: %d' %i)

def thread2(i):
    time.sleep(3)
    #print('No. printed by Thread 2: %d' %i)

if __name__ == '__main__':
    t1 = threading.Thread(target=thread1, args=(10,))
    t2 = threading.Thread(target=thread2, args=(12,))
    t1.start()
    t2.start()
    print("No. of active threads: " + threading.active_count())
    t1.join()
    t2.join()

活动线程数:3

尝试在上面的终端中运行该代码。您将看到线程数为 3 ,因为我们已经创建了 2 个线程,并且在主线程中正在进行完整的执行。


穿线。current_thread()

该函数将返回当前线程对象,对应调用者的控制线程(当前在调用者的控制中)。如果调用者的控制线程不是通过线程模块(例如主线程)创建的,则返回一个功能有限的伪线程对象。

import time
import threading

def thread1(i):
    time.sleep(3)
    #print('No. printed by Thread 1: %d' %i)

def thread2(i):
    time.sleep(3)
    #print('No. printed by Thread 2: %d' %i)

if __name__ == '__main__':
    t1 = threading.Thread(target=thread1, args=(10,))
    t2 = threading.Thread(target=thread2, args=(12,))
    t1.start()
    t2.start()
    print("Current thread is: " + threading.current_thread())
    t1.join()
    t2.join()

当前线程为:


穿线。get_ident()

该函数返回当前线程的线程标识符。这是一个非零整数值。如果我们启动了线程,那么这个方法将返回它的标识符,否则,它将返回无。

我们可以使用这个方法来索引线程特定数据的字典。当一个线程退出(停止)并创建另一个线程时,可以回收线程标识符。

threading.get_ident()

140578859194112


穿线。enumerate()

该方法返回当前活动的所有Thread对象的列表。该列表包括后台线程(当程序退出时,与之相关的所有后台线程都将自动终止)当前线程创建的虚拟线程对象,以及主线程。

此列表中不存在已终止的线程和尚未启动的线程。

 threading.enumerate() 

[ 、、 ]


穿线。main_thread()

此方法返回主 Thread对象。在正常情况下,主线程是启动 python 解释器的线程。

 threading.main_thread() 

穿线。settrace(fun)

该方法用于为使用threading模块启动的所有线程设置跟踪函数/钩子。对于每个线程,跟踪函数被传递给sys.settrace()方法,该方法在调用run()方法之前被附加到线程。

我们希望作为跟踪函数的回调函数将接收三个参数:frame(来自正在运行的代码的堆栈帧)event(一个命名通知类型的字符串)和arg(一个特定于事件的值)

def hello(frame, event, arg):
    print("Hello, I am a trace hook.")
threading.settrace(hello) 

尝试更新顶部终端中的代码。将hello函数放在主方法和语句threading.settrace(hello)之外,就在我们为线程调用start方法的语句之上。


穿线。setprofile(fun)

此方法用于为从threading模块启动的所有线程设置配置文件函数。和 trace 函数一样,profile 函数也传递给每个线程的sys.setprofile()方法,在调用run()方法之前附加到线程。

 threading.setprofile(hello) 

穿线。stack_size([size])

此方法返回创建新线程时使用的线程堆栈大小。size参数是可选的,可用于设置创建后续线程所用的堆栈大小,必须为 0 或正整数(D =默认值为 0)。

如果不支持更改线程堆栈大小,则会引发运行时错误。

如果指定的堆栈大小无效,将引发值错误。

目前 32 KiB 是支持的最小堆栈大小,为解释器提供足够的堆栈空间。


穿线。TIMEOUT_MAX

除了上述指定的功能外,threading模块还定义了一个常数。如果您指定的超时值大于TIMEOUT_MAX常量的值,您将得到一个OverflowError


threading模块对象

除了上面指定的功能之外,threading模块还提供了许多类,这些类的对象在创建和管理线程时非常有用。

以下是一些对象类型:

| 目标 | 描述 | | 线 | 对象,表示单个执行线程。 | | 锁 | 原始锁对象。 | | 断续器 | RLock 或可重入锁对象为单线程提供了获取(重)已持有锁(递归锁)的能力。 | | 情况 | 条件变量对象使一个线程等待,直到另一个线程满足某个“条件”(如状态变化或某些数据值) | | 事件 | 这是条件变量的一个更通用的版本,可以让许多线程等待某个事件的发生,所有等待的线程只有在事件发生时才会被唤醒。 | | 旗语 | 当线程块之间共享的有限资源不可用时,提供一个“计数器”。 | | 有界符号 | 类似于信号量,但确保它永远不会超过初始值。 | | 计时器 | 类似于线程,除了它在运行之前等待一段指定的时间。 | | 屏障 | 创建一个“屏障”,指定数量的线程必须全部到达该屏障,然后才能继续运行。 |

上表简要介绍了 python threading模块中的各种对象类型。我们将在接下来的几个教程中详细讨论所有这些对象。