_thread
——低级线程API¶
此模块提供用于处理多个线程(也称为 light-weight processes 或 tasks )---多个控制线程共享其全局数据空间。对于同步,简单锁(也称为 mutexes 或 binary semaphores )提供。这个 threading
模块提供了一个更易于使用的高级线程API,它构建在模块之上。
在 3.7 版更改: 这个模块以前是可选的,现在总是可用的。
此模块定义以下常量和函数:
- exception _thread.error¶
在线程特定错误上引发。
在 3.3 版更改: 这是内置的
RuntimeError
.
- _thread.LockType¶
这是锁定对象的类型。
- _thread.start_new_thread(function, args[, kwargs])¶
启动一个新线程并返回其标识符。线程执行函数 功能 带参数列表 args (必须是元组)。可选 关键字参数 参数指定关键字参数的字典。
当函数返回时,线程将静默退出。
当函数以未处理的异常终止时,
sys.unraisablehook()
调用以处理异常。这个 对象 hook参数的属性为 功能 . 默认情况下,将打印堆栈跟踪,然后线程退出(但其他线程将继续运行)。当函数引发
SystemExit
异常,它被静默忽略。在 3.8 版更改:
sys.unraisablehook()
现在用于处理未处理的异常。
- _thread.interrupt_main()¶
模拟
signal.SIGINT
到达主线程的信号。线程可以使用此函数中断主线程。如果
signal.SIGINT
不是由python处理的(它被设置为signal.SIG_DFL
或signal.SIG_IGN
,此函数不起作用。
- _thread.exit()¶
提高
SystemExit
例外。如果未捕获,这将导致线程静默退出。
- _thread.allocate_lock()¶
返回新的锁定对象。锁的方法如下所述。锁最初解锁。
- _thread.get_ident()¶
返回当前线程的“线程标识符”。这是一个非零整数。它的值没有直接的意义;它被用作一个神奇的cookie,用于索引线程特定数据的字典。当一个线程退出并创建另一个线程时,可以回收线程标识符。
- _thread.get_native_id()¶
返回内核分配的当前线程的本机整数线程ID。这是一个非负整数。它的值可用于唯一地标识这个特定的线程系统范围(直到线程终止,之后该值可由操作系统回收)。
Availability :windows、freebsd、linux、macos、openbsd、netbsd、aix。
3.8 新版功能.
- _thread.stack_size([size])¶
返回创建新线程时使用的线程堆栈大小。可选的 size 参数指定要用于后续创建的线程的堆栈大小,并且必须为0(使用平台或配置的默认值)或至少为32768(32 kib)的正整数值。如果 size 未指定,使用0。如果不支持更改线程堆栈大小,则
RuntimeError
提高了。如果指定的堆栈大小无效,则ValueError
被引发,堆栈大小未被修改。32 kib是当前支持的最小堆栈大小值,以确保为解释器本身提供足够的堆栈空间。请注意,有些平台可能对堆栈大小的值有特定的限制,例如要求最小堆栈大小>32 kib或要求以系统内存页面大小的倍数分配-有关更多信息,应参考平台文档(通常使用4 kib页面;使用4096倍数作为堆栈大小是在缺乏更具体信息的情况下,采用GEGSTED方法)。Availability :Windows,具有POSIX线程的系统。
- _thread.TIMEOUT_MAX¶
允许的最大值 timeout 参数
Lock.acquire()
. 指定大于此值的超时将引发OverflowError
.3.2 新版功能.
锁定对象有以下方法:
- lock.acquire(waitflag=1, timeout=- 1)¶
如果没有任何可选参数,此方法将无条件获取锁,如果需要,等待另一个线程释放锁(一次只有一个线程可以获取锁——这就是它们存在的原因)。
如果整数 waitflag 存在参数时,操作取决于其值:如果为零,则仅当可以立即获取而不等待时才获取锁;如果为非零,则如上所述无条件获取锁。
如果浮点 timeout 参数存在且为正,它指定返回前的最大等待时间(秒)。否定的 timeout 参数指定无限等待。不能指定 timeout 如果 waitflag 是零。
返回值为
True
如果成功获取锁,False
如果没有。在 3.2 版更改: 这个 timeout 参数是新的。
在 3.2 版更改: 锁获取现在可以被POSIX上的信号中断。
- lock.release()¶
释放锁。锁必须在前面获得,但不一定是由同一线程获得的。
- lock.locked()¶
返回锁的状态:
True
如果它是由某个线程获取的,False
如果没有。
除了这些方法外,还可以通过 with
声明,例如:
import _thread
a_lock = _thread.allocate_lock()
with a_lock:
print("a_lock is locked while this executes")
Caveats:
线程与中断发生奇怪的交互:
KeyboardInterrupt
异常将由任意线程接收。(当signal
模块可用,中断始终转到主线程。)调用
sys.exit()
或提高SystemExit
异常等同于调用_thread.exit()
.无法中断
acquire()
锁具上的方法KeyboardInterrupt
获取锁后将发生异常。当主线程退出时,系统定义其他线程是否存活。在大多数系统中,它们在没有执行的情况下被杀死
try
…finally
子句或执行对象析构函数。