该模块在Python 3中更名为 _thread。
该模块实现对Python多线程的低层次操作原语,也提供了多线程之间用于同步的锁机制。threading 模块基于本模块提供了更易用的高层次线程API。Windows、Linux、SGI IRIX、Solaris 2.x、和支持 POSIX thread (a.k.a. “pthread”) 的平台都支持该模块,对于不支持 thread 模块的平台,使用 dummy_thread 作为替代。
该模块中定义的常量和函数
exception thread.error
当出现线程相关的异常时抛出
thread.LockType
lock 对象的类型
thread.start_new_thread(function, args[, kwargs])
启动一个新线程,返回它的标识符。
该新启动的线程会用参数列表 args (必须是一个元组)中的参数调用 function,关键字参数 kwargs 是可选的。当函数 function 返回时,执行它的线程静默退出,当函数因为一个未处理的异常而终止时,线程退出同时打印堆栈轨迹。
thread.interrupt_main()
在主线程中抛出异常 KeyboardInterrupt,子线程可以使用该函数去打断主线程
Python 2.3 引入
thread.exit()
抛出异常 SystemExit,如果这个异常没有被捕获,会让线程静默退出
thread.allocate_lock()
返回一个新的 lock 对象,该实例初始时没有被上锁
thread.get_ident()
返回当前线程的线程标识符,这是一个非零整数,值并没有实际意义,就是用来在线程相关的字典中检索指定线程的信息,当一个线程退出时,它的标识符会被回收等待以后创建新线程时使用。
thread.stack_size([size])
返回创建线程时使用的线程栈大小,可选参数 size 指示以后创建新线程时的栈大小,必须是0(使用平台默认)或者是一个不小于32,768 (32kB)的整数。如果不支持改变线程栈的大小,该函数将会抛出异常 error。如果指定的栈大小无效,将会抛出 ValueError,同时下次新建线程时栈的大小不变。
32kB 是Python当前支持的最小栈空间,如果没有查阅具体的平台对于线程栈大小的具体规范,使用4KB的倍数是一个比较保险的办法。
适用于: Windows, systems with POSIX threads.
Python 2.5 引入
Lock 对象
lock.acquire([waitflag])
无参数调用时,该方法会无条件的获得锁,或者等待其他的线程释放锁(一次只有一个线程可以获得锁),如果提供整型参数 waitflag,该方法的行为依赖于这个参数:
如果 waitflag 是0:只有在该锁可以立即获得(不用等待)时才会让这个线程获得锁;
如果 waitflag 非0:线程会像无参数时那样获取锁
返回值:
成果获得锁返回 True ,否则返回 False
lock.release()
释放锁,必须是已经获得的锁,但可以不是同一个线程。
lock.locked()
返回 lock 对象的状态:如果已经被某些线程获取就返回 True ,否则返回 False
示例:使用 with 语句使用线程锁
import thread a_lock = thread.allocate_lock() with a_lock: print "a_lock is locked while this executes"
注意事项
- 线程和中断的交互比较奇怪:异常 KeyboardInterrupt 可以被任意线程接收,(当 signal 模块可用时,中断总是发向主线程
- 调用 sys.exit() 或抛出异常 SystemExit 等价于调用 thread.exit()
- acquire() 方法是不可中断的—— KeyboardInterrupt 会在锁获取后才发生
- 当主线程退出时,其他线程的行为是平台定义的,SGI IRIX 使用可原生的线程实现,所以其他的线程能够存活;在大多数其他平台上,其他的线程会被直接杀掉,而不用执行 try ... finally 分句或其他的对象析构函数
- 当主线程退出时,不会执行除 try ...finally 以外的其他清理,标准I/O也不会被刷出。