thread
线程 - 多个控制线程
注意
该thread
模块已被重命名为_thread
Python 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文件不会被刷新。