Thread 对象
这个类表示在单独的一个控制线程中运行的一个活动。有两种指定活动的方法:通过传递一个可调用对象给构造函数,或在子类中覆盖run()方法。在子类中不应该覆盖其它方法(构造函数除外)。换句话说,就是只覆盖该类的init()和run()方法。
一个线程对象创建后,它的活动必须通过调用线程的start()方法启动。它在单独的一个控制线程中调用run()方法。
线程的活动一旦开始,该线程就被认为是‘活着的’。在它的run()方法终止时它停止存活 – 要么正常地,要么通过引发一个未处理的异常。is_alive()方法测试该线程是否活着。
其它线程可以调用另外一个线程的join()方法。这将阻塞调用的线程直至join()方法被调用的线程终止。
一个线程具有一个名字。这个名字可以传递给构造函数,以及通过name属性读取和更改。
一个线程可以标志为一个“守护线程”。该标志的意思是整个Python程序在只剩下守护线程时才退出。它的初始值继承自创建它的线程。该标志可以通过daemon属性设置。
注 守护线程在关机时被意外地终止。它们的资源(例如打开的文件、数据库事务等)可能没有正确地释放。如果你想你的线程优雅地停止,可以让它们成为非守护的并使用一个合适的信号机制例如一个Event。
有一个“主线程”对象;它对应于Python程序中初始的控制线程。它不是一个守护线程。
可能创建的是“虚拟的线程对象”。这些线程对象对应于“异质的线程”,它们是在threading模块之外启动的控制线程,例如直接从C代码中启动的线程。虚拟的线程对象具有有限的功能;它们始终被认为是活着的和守护的,且不可以被join()。它们永远不会被删除,因为异质线程的终止不可能检测到。
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})
应该始终以关键字参数调用该构造函数。参数有:
group应该为None;被保留用于未来实现了ThreadGroup类时的扩展。
target是将被run()方法调用的可调用对象。默认为None,表示不调用任何东西。
name是线程的名字。默认情况下,以“Thread-N”的形式构造一个唯一的名字,N是一个小的十进制整数。
args是给调用目标的参数元组。默认为()。
kwargs是给调用目标的关键字参数的一个字典。默认为{}。
如果子类覆盖该构造函数,它必须保证在对线程做任何事之前调用基类的构造函数(Thread.init())。
start()
开始线程的活动。
每个线程对象必须只能调用它一次。它为对象的run()方法在一个单独的控制线程中调用做准备。
在相同的线程对象上调用该方法多次将引发一个RuntimeError。
run()
表示线程活动的方法。
你可以在子类中覆盖这个方法。标准的run()方法调用传递给对象构造函数target参数的可调用对象,如果存在,分别从args和kwargs参数获取顺序参数和关键字参数。
join([timeout])
等待直至线程终止。它阻塞调用线程直至join()方法被调用的线程终止 – 要么正常地要么通过一个未处理的异常 – 或者直至timeout发生。
当timeout参数存在且不为None时,它应该以一个浮点数指定该操作的超时时间,单位为秒(可以是小数)。由于join()永远返回None,你必须在join()之后调用isAlive()来判断超时是否发生 – 如果线程仍然活着,则join()调用超时。
如果timeout参数不存在或者为None,那么该操作将阻塞直至线程终止。
一个线程可以被join()多次。
如果尝试join当前的线程,join()会引发一个RuntimeError,因为这将导致一个死锁。在线程启动之前join()它也是错误的,尝试这样做会引发同样的异常。
name
一个字符串,只用于标识的目的。它没有语义。多个线程可以被赋予相同的名字。初始的名字通过构造函数设置。
getName()
setName()
ident
线程的ID,如果线程还未启动则为None。它是一个非零的整数。参见thread.get_ident()函数。当一个线程退出另外一个线程创建时,线程的ID可以重用。即使在线程退出后,其ID仍然可以访问。
is_alive()
isAlive()
返回线程时候是活着。
在run()方法刚开始之前至run()方法刚终止之后,该方法返回True。模块级别的函数enumerate()返回所有活着的函数的一个列表。
daemon
一个布尔值,指示线程是(True)否(False)是一个守护线程。它必须在调用start()之前设置,否则会引发RuntimeError。它的初始值继承自创建它的线程;主线程不是一个守护线程,所以在主线程中创建的所有线程默认daemon = False。