python-threading

本文详细介绍了Python的threading模块,包括线程的分类、守护线程的概念和设置,以及如何通过Thread类创建线程实例,包括传入函数、可调用类实例以及派生子类的方法。重点讨论了守护线程的特性及其在主线程退出后的行为,以及Thread类的弃用方法和推荐的属性设置方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、threading可用类

二、守护线程

线程分为两种,用户线程和守护线程。

当主线程退出时,所有子线程都将终止,不管它们是否仍在工作。threading 模块支持守护线程,其工作方式是:守护线程一般是一个等待客户端请求服务的服务器。如果没有客户端请求,守护线程就是空闲的。

守护线程本质也是线程,因此其创建方式和普通线程一样,唯一不同之处在于,将普通线程设为守护线程,需通过线程对象调用其 damon 属性,将该属性的值该为 True。Python 解释器的垃圾回收机制就是守护线程的典型代表,当程序中所有主线程及非守护线程执行完毕后,垃圾回收机制也就没有再继续执行的必要了。daemon的使用场景是:你需要一个始终运行的进程,用来监控其他服务的运行情况,或者发送心跳包或者类似的东西,你创建了这个进程都就不用管它了,他会随着主线程的退出出而退出了。

没有设置daemon的线程会继承父线程的状态,主线程默认是非daemon线程。

并且需要注意的一点是,线程对象调用 daemon 属性必须在调用 start() 方法之前,否则 Python 解释器将报 RuntimeError 错误。

要将一个线程设置为守护线程,需要在启动线程之前执行如下赋值语句:thread.daemon = True(调用 thread.setDaemon(True)的旧方法已经弃用了)。同样,要检查线程的守护状态,也只需要检查这个值即可。

三、Thread类

① 该方法已弃用,更好的方式是设置(或获取) thread.name 属性,或者在实例化过程中传递该属性。
② 驼峰式命名已经弃用,并且从 Python 2.6 版本起已经开始被取代。
③ is/setDaemon()已经弃用,应当设置 thread.daemon 属性;从 Python 3.3 版本起,也可以通过可选的 daemon 值在实例化过
程中设定 thread.daemon 属性。

• 创建 Thread 的实例,传给它一个函数。
• 创建 Thread 的实例,传给它一个可调用的类实例。
• 派生 Thread 的子类,并创建子类的实例。

四、创建 Thread 的实例,传给它一个函数

当实例化每个 Thread 对象时,把函数(target)和参数(args)传进去,然后得到返回的 Thread 实例。实例化 Thread(调用 Thread())和调用 thread.start_new_thread()的最大区别是新线程不会立即开始执行。

当所有线程都分配完成之后,通过调用每个线程的 start()方法让它们开始执行,而不是在这之前就会执行。相比于管理一组锁(分配、获取、释放、检查锁状态等)而言,这里只需要为每个线程调用 join()方法即可。 join()方法将等待线程结束,或者在提供了超时时间的情况下,达到超时时间。

五、创建 Thread 的实例,传给它一个可调用的类实例

在创建线程时,与传入函数相似的一个方法是传入一个可调用的类的实例,用于线程执行——这种方法更加接近面向对象的多线程编程。这种可调用的类包含一个执行环境,比起一个函数或者从一组函数中选择而言,有更好的灵活性。现在你有了一个类对象,而不仅仅是单个函数或者一个函数列表/元组。

主要是添加了 ThreadFunc 类,并在实例化 Thread 对象时做了一点小改动,同时实例化了可调用类 ThreadFunc。我们希望这个类更加通用,而不是局限于 loop()函数,因此添加了一些新的东西,比如让这个类保存了函数的参数、函数自身以及函数名的字符串。而构造函数__init__()用于设定上述这些值。

当创建新线程时, Thread 类的代码将调用 ThreadFunc 对象,此时会调用__call__()这个特殊方法。由于我们已经有了要用到的参数,这里就不需要再将其传递给 Thread()的构造函数了,直接调用即可。

六、派生 Thread 的子类,并创建子类的实例

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值