Python——thread

  该模块在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也不会被刷出。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。