_thread模块是threading模块的基础模块,为多线程提供了低级别的基元(也称为轻量级进程或任务)。为了同步,简单的锁(也叫做互斥锁或二元信号量)被提供。threading模块在该模块的基础上提供了更易使用并且更高级别的线程API。
该模块支持Windows、Linux、SGI IRIX、Solaris 2.x、以及任何实现了POSIX线程的系统。
_thread模块
它定义了如下的常量和函数:
exception _thread.error
线程错误。从3.3版本呢开始相当于RuntimeError。
_thread.LockType
锁对象类型。
_thread.start_new_thread(function, args[, kwargs])
开始一个新的线程并返回它的标识符。线程使用参数args(必须是一个元组)执行function函数。可选参数kwargs制定了一个参数字典。当函数返回时,线程退出。当函数异常终止时,一个栈轨迹被打印然后线程退出(但是其它线程继续执行)。
_thread.interrupt_main()
在主线程抛出一个KeyboardInterrupt异常。一个子线程能用这个函数中断主线程。
_thread.exit()
抛出SystemExit异常。如果不被捕获,将导致线程退出。
_thread.allocate_lock()
返回一个新的锁对象。锁的方法在下一节讲述。锁初始处于未锁状态。
_thread.get_ident()
返回当前线程的“线程标识符”。这是一个非0整数。它的值没有直接的含义;他被作为魔法饼干使用,例如:索引特定线程数据的字典信息。线程标识符会被循环使用。
_thread.stack_size([size])
返回线程栈的大小,当创建新线程的时候使用。可选参数size指定接下来创建线程需要的栈大小,必须是0(用平台或者配置默认)或者一个最小32768(32KiB)的正整数,如果改变线程栈大小不被支持,一个RuntimeError异常被抛出;如果指定的栈大小是无效的,一个ValueError被抛出并且栈大小不被修改。32KiB是当前支持的最小的栈大小,为解释器自身保证足够的栈空间。注意,一些平台对栈大小的值有特殊的限制,例如要求最小栈大小大于32KiB,或者要求必须分配系统内存页大小的倍数(参考平台文档,页大小通常是4KiB)。在以下平台可用:Windows、带有POSIX线程的系统。
_thread.TIMEOUT_MAX
Lock.acquire()的timeout参数允许的最大值。若指定的值超过该值,则抛出OverflowError。
Lock对象
Lock对象包含下面的方法。
lock.acquire(waitflag=1, timeout=-1)
不带参数的情况下,该方法无条件地请求锁,如有必要,线程将等待直到其它线程释放锁(一次仅一个线程能获取锁)。
如果整数参数waitflag被设置,行为将依赖该参数的值:如果为0,锁将不等待立即返回,如果为非0,则锁则无条件地等待。
如果浮点型参数timeout被设置并且大于0,它指定等待的最大秒数。一个负的timeout表示永久等待。如果waitflag为0,你不能指定timeout。
如果锁获取成功,则返回True,否则,返回False。
从3.2版开始,acquire能被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")