正如我们在之前的教程中所看到的,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
模块中的各种对象类型。我们将在接下来的几个教程中详细讨论所有这些对象。