在线文档教程

thread

线程 - 多个控制线程

注意

thread模块已被重命名为_threadPython 3. 2to3工具将自动适应导入将源代码转换为Python 3; 但是,您应该考虑使用高级threading模块。

该模块提供了用于处理多个线程(也称为轻量级进程任务)的低级原语- 多个控制线程共享其全局数据空间。为了同步,提供了简单的锁(也称为互斥锁二进制信号量)。该threading模块提供了构建在该模块之上的更易于使用和更高级的线程化API。

该模块是可选的。它在Windows,Linux,SGI IRIX,Solaris 2.x以及具有POSIX线程(又名“pthread”)实现的系统上受支持。对于缺少thread模块的系统,该dummy_thread模块可用。它复制了该模块的接口,可以用作插入式替换。

它定义了以下常数和函数:

exception thread.error

引发线程特定的错误。

thread.LockType

这是锁定对象的类型。

thread.start_new_thread(function, args[, kwargs])

开始一个新的线程并返回它的标识符。该线程使用参数列表args(它必须是一个元组)执行函数函数。可选的kwargs参数指定关键字参数的字典。当函数返回时,该线程静静地退出。当函数以未处理的异常终止时,将打印一个堆栈跟踪,然后该线程退出(但其他线程继续运行)。

thread.interrupt_main()

KeyboardInterrupt在主线程中引发异常。一个子线程可以使用这个函数来中断主线程。

2.3版本的新功能。

thread.exit()

引发SystemExit异常。当未被捕获时,这将导致线程无声地退出。

thread.allocate_lock()

返回一个新的锁定对象。下面描述锁的方法。锁最初是解锁的。

thread.get_ident()

返回当前线程的'线程标识符'。这是一个非零整数。它的价值没有直接的意义; 它的目的是作为一个神奇的cookie用于例如索引线程特定数据的字典。当线程退出并创建另一个线程时,线程标识符可能会被回收。

thread.stack_size([size])

Return the thread stack size used when creating new threads. The optional size argument specifies the stack size to be used for subsequently created threads, and must be 0 (use platform or configured default) or a positive integer value of at least 32,768 (32kB). If size is not specified, 0 is used. If changing the thread stack size is unsupported, the error exception is raised. If the specified stack size is invalid, a ValueError并且堆栈大小未修改。32kB是目前支持的最小堆栈大小值,以保证解释器本身具有足够的堆栈空间。请注意,某些平台可能对堆栈大小的值有特殊限制,例如要求最小堆栈大小> 32kB或需要以系统内存页大小的倍数进行分配 - 有关更多信息,应参考平台文档(4kB页是常见的;对于堆栈大小,使用4096的倍数是没有更具体信息的建议方法)。可用性:Windows,带有POSIX线程的系统。

2.5版本中的新功能。

锁对象具有以下方法:

lock.acquire([waitflag])

如果没有可选的参数,这个方法无条件地获取锁,如果有必要的话,等待它被另一个线程释放(一次只有一个线程可以获得一个锁 - 这是它们存在的原因)。如果存在整数waitflag参数,则该操作取决于其值:如果为零,则只有在可以立即获取而不等待的情况下才会获取锁定,而如果为非零值,则锁定将像以前一样无条件获取。返回值True是否成功获取锁定,False如果不成功。

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"

注意事项:

  • 线程奇怪地与中断交互:KeyboardInterrupt异常将被任意线程接收。(当signal模块可用时,中断总是进入主线程。)

  • 调用sys.exit()或引发SystemExit异常等同于调用thread.exit()

  • 无法acquire()在锁上中断方法 - 在KeyboardInterrupt获取锁之后会发生异常。

  • 当主线程退出时,系统定义其他线程是否存活。在使用本地线程实现的SGI IRIX上,它们能够存活下来。在大多数其他系统上,它们在不执行try... finally子句或执行对象析构函数的情况下被终止。

  • 当主线程退出时,它不会执行任何通常的清理(除了try... finally子句被尊重),并且标准I / O文件不会被刷新。