Python threading.Thread类核心用法与参数详解
本文详细解析Python中threading.Thread类的核心用法。涵盖通过回调对象或重写run()方法两种线程指定方式,深入讲解start()、join()、isAlive()等关键方法的执行逻辑与阻塞机制。同时完整列举构造函数参数(group、target、name、args、kwargs)及守护线程、线程命名等高级特性,帮助开发者掌握Python多线程编程的最佳实践。
Python中的Thread类用于表示在独立控制线程中执行的活动。定义线程活动主要有两种途径:
1、在构造函数中传入回调函数对象
mthread=threading.Thread(target=xxxx,args=(xxxx)) mthread.start()
2、继承Thread类并重写run()方法
以下是一个简单的示例:
import threading, time
class MyThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
global n, lock
time.sleep(1)
if lock.acquire():
print n , self.name
n += 1
lock.release()
if "__main__" == __name__:
n = 1
ThreadList = []
lock = threading.Lock()
for i in range(1, 200):
t = MyThread()
ThreadList.append(t)
for t in ThreadList:
t.start()
for t in ThreadList:
t.join()
在派生类中,我们重写了父类threading.Thread的run()方法。除构造函数外,其他方法不应在子类中被重写,即子类中仅需重写__init__()和run()方法。使用时,先实例化子线程类对象,随后调用该对象的start()方法即可启动线程(start内部会调用run)
接下来介绍threading.Thread类的常用函数与方法:
1、线程对象创建后,必须通过调用start()方法来启动其活动。该方法会安排在一个独立的控制线程中执行run()方法。
2、线程被激活后,其状态为'alive'(活动)。当run()方法正常结束或抛出未处理的异常时,活动状态终止。isAlive()方法用于检测线程是否处于活动状态。大致而言,从start()调用开始到run()方法返回期间,线程均被视为活动状态。模块函数enumerate()可返回当前活动线程的列表。
3、一个线程可以调用其他线程的join()方法。这将导致调用线程阻塞,直到拥有join()方法的线程终止执行。
4、线程拥有名称,默认格式为'Thread-N',其中N为较小的十进制数。可通过构造函数传递名字,或使用setName()方法设置,通过getName()方法获取。
5、线程可被标记为'daemon thread'(守护线程)。其特性是:当进程中仅剩守护线程时,Python程序将自动退出。该标志的初始值继承自创建线程。可通过setDaemon()方法设置,通过isDaemon()方法获取。
6、存在'main thread'(主线程),它对应于Python程序的初始控制线程。主线程不是后台线程。
7、
class Thread(group=None, target=None, name=None, args=(), kwargs={})
构造函数支持通过关键字参数进行调用。
具体参数如下:
group:应为None,为未来扩展Python Thread类预留。
target:是被run()方法调用的回调对象。默认为None,表示不调用任何对象。
name:线程名称。默认情况下,会创建唯一的名字'Thread-N',其中N为较小的十进制数。
args:目标调用的参数元组,默认为空元组()。
kwargs:目标调用的参数字典,默认为{}。
8、如果子线程重写了构造函数,必须确保在调用基类构造函数(Thread.__init__())后再进行其他操作(即派生类初始化时需先调用基类构造函数)。
9、start()
启动线程活动。每个线程对象最多调用一次。它安排对象的run()在单独的控制线程中执行。
10、run()
表示线程活动的方法。你可以在Thread类的子类中重写此方法。标准的run()方法会调用作为target传递给构造函数的回调对象。
11、join([timeout])
等待线程终止。阻塞调用线程,直到调用join()方法的线程终止(正常退出或抛出未处理的异常),或者发生可选的超时。
若timeout参数不为None,它应为浮点数,指定以秒为单位的超时值。由于join()始终返回None,你必须调用isAlive()来判断是否发生超时。
当未指定timeout参数或为None时,操作将阻塞直至线程终止。
线程可以被join()多次调用。
线程不能调用自身的join(),否则会导致死锁。
在线程启动前尝试调用join()会引发错误。
12、
getName()
返回线程名称。
setName(name)
设置线程名称。
该名称仅用于标识目的,无其他作用。多个线程可拥有相同名称。初始名称通过构造函数设置。
isAlive()
返回线程是否处于活动状态。
isDaemon()
返回线程的守护线程标志。
setDaemon(daemonic)
将守护线程标志设置为布尔值daemonic。此方法必须在start()调用之前被调用。
当不存在活动的非守护线程时,整个Python程序退出。
以上关于Python threading.Thread类使用方法的详解即为全部内容,希望能提供参考,欢迎支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













