2019/12/18 03-线程属性和方法及start、run的区别

本文深入探讨Python中线程的创建、运行、终止及管理,解析线程ID的作用与重要性,阐述线程与进程的区别,以及如何利用threading模块有效监控线程状态。

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

python中线程的终止方式就是结束,和销毁,线程的生命周期就是创建,直至运行结束,操作系统必须分配给每个线程时间来跑起来,有调度过程,
cpu都可以进行最小单位线程的调度,线程里是代码,代码就是指令,python需要编译成中间代码交给解释器来执行,python解释器就是pvm,python的虚拟机
nz

线程启动,运行,消亡,线程有多个,如何知道当前线程是哪个,threading库就提供了

返回当前线程
在这里插入图片描述
main_thread()主线程是谁
在这里插入图片描述
当前处在运行的线程
在这里插入图片描述
可以列出所有或者的线程的列表,不会列出运行完的线程
在这里插入图片描述
返回线程id,id是唯一标识,区分不同线程,就是靠id,区分不同进程,也是靠id,通过id可以快速访问到你想要的进程和线程,非0整数
在这里插入图片描述在这里插入图片描述
这个是一个普通的方法。这个函数是放在主线程中运行的
在这里插入图片描述
这个函数在线程里面跑
在这里插入图片描述在这里插入图片描述
start,worker就启动起来了
先打印当前线程,主线程,id都是7000,当前活动线程是一个
在这里插入图片描述
启动start工作线程,就立即打印,线程信息
当前线程,6852
下面的end,代表主线程和工作线程是并行的,都在跑,但是其实是假平行,因为cpu是调度

在这里插入图片描述
breadk为止,整个程序结束
在这里插入图片描述
主线程表面和工作线程都在跑。感觉是在并行在这里插入图片描述
多写几个感觉更强,多线程就是一个解决并发的方案在这里插入图片描述
这是threading模块提供的方法,enumerate就是把当前线程列出在这里插入图片描述在这里插入图片描述
线程对象的属性和方法

线程启动才会有ID,线程id是可以重复利用的,再次利用的id,有可能是另外的线程,线程id一定在当前进程中是唯一的
在这里插入图片描述
询问线程是否还活着
在这里插入图片描述
线程名字可以重复,但是线程的ID是不可以重复的,但是可以重复利用在这里插入图片描述在这里插入图片描述在这里插入图片描述
每一秒判断线程是否活着
在这里插入图片描述
如果线程不在了,那么线程对象是否还存在,那么t.start()调用是否正确,但是到下面其实线程对象是在的在这里插入图片描述
不用t.start也可以证明线程对象是存在的,t.name是可以调用的,如果线程对象不存在,就根本不可能t.name

打印出none,就代表还没有start
在这里插入图片描述在这里插入图片描述
线程消亡了,is_alive应该是false,但是线程对象还在,id还在,目前这个id还是给它
在这里插入图片描述

线程对象还在,启动一下,运行时异常,线程只能被start once,用start方法,线程只能启动一次,运行完,生命周期就结束了,虽然此对象还在,因为t还在,但是不允许再次start一次,只能创建一个新的线程,start不允许你对同一个线程对象进行调用两次start
在这里插入图片描述
这是一个启动的新的进程对象,跟刚才的没有任何关系,新的线程
在这里插入图片描述
start会重新分配一个ID,start不允许启动两次在这里插入图片描述在这里插入图片描述
有两个属性,name和daemon,run,is_alive,start三个方法
在这里插入图片描述
start的意思是启动,run的意思是跑起来
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
构建一个类,覆盖的方法,什么都没做
在这里插入图片描述在这里插入图片描述
调用方式,start调用,现在break,什么都没做
在这里插入图片描述
试试父类的,super().start(),然后在前面加一个打印,可以查看调用时机
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
启动线程,先调用自己的再调用,这就是多态,调用父类的方法,来解决创建线程的问题在这里插入图片描述
start之后应该是调用run的,说明start调用run在这里插入图片描述
使用run方法能不能成功来完成,是可以的
在这里插入图片描述
发现调用run方法也可以达到start方法
先用start,一定会创建线程,工作线程和主线程,打印的就是当前工作线程,1452

在这里插入图片描述
使用run就只有1个线程,现在的运行相当于在主线程中直接运行了线程函数,打印发现当前主线程是主线程,当前工作线程还是主线程,当前就一个线程,run方法是运行线程指定的target函数,start就是靠run调用来运行线程函数
直接用run,就是省了一个start创建线程,直接用run方法相当于单线程
在这里插入图片描述
单线程是依次执行,前面的函数不执行完,后面的就没办法执行,就没办法打印后面的print函数
在这里插入图片描述
但如果使用 了start,就是多线程齐头并进的方法,上面启动一个新的线程就跟下面的print无关,在这里插入图片描述
单线程的时候,A语句不运行完,是不能运行B语句的
在这里插入图片描述
多线程,开启工作线程不影响主线程就继续向下执行
在这里插入图片描述
一个线程创建是必须有ID的,单线程工作是顺序执行,一个函数执行并返回后,才能继续下面的运行,顺序执行效果就没有并发的执行效果了

分析当下写的程序,使用start的时候,t=xxx,创建线程对象,这个线程对象是放在主线程当中的,线程继续向下执行,到33行,start会立即创建一个线程,此方法调用结束(是在主线程)start就方法返回了,主线程就继续向下35行调用print方法,调用这个print方法去打印对象的id,创建对象的时候,也就有了id,所以可以打印id在这里插入图片描述
工作线程就不听的im working,主线程继续向下,最后都执行完了,退出程序,这就是一种并行的效果在这里插入图片描述
这样就进入死循环了,主线程完了在等待工作线程结束,但是是死循环就一直在等在这里插入图片描述
换成run在这里插入图片描述
死循环就结束不了,打印不了none在这里插入图片描述
单线程,函数一直运行,压栈,就出不来,下一个语句就根本运行不了

查看一下start方法在这里插入图片描述在这里插入图片描述
到达super、这里,start有个标志被设定了,就只能启动一次在这里插入图片描述
有一些异常就有锁,尤其多线程锁是需要用的(比如争抢的,肯定要锁),把锁解了,把异常直接抛出了,没有进行处理,
exception,非退出的内建异常和自定义的都归exception管

在这里插入图片描述
target是函数,把函数对象送进来,run函数没什么说的,就是调用函数执行
在这里插入图片描述
start的函数唯一不同的就是这里,创建新的线程
在这里插入图片描述
是系统调用c源码,创建完线程会return线程标识符,
在这里插入图片描述
start调用后会返回一个线程id,真正创建线程的是start方法,调用操作系统的功能,为我们创建线程,用了start就看到了多线程,单线程是串行,多线程是并行

用并行的方式来解决并发,多线程如此,多进程也是如此,线程是操作系统调度最小单位,会分配时间片,就绪就可以调度运行,消耗时间片,回到就绪状态,如果要访问IO,就从运行状态转换为阻塞,不调度它了,阻塞把IO处理完,就还原成为就绪,就可以被调度了
在这里插入图片描述在这里插入图片描述
cpu就是运行不同线程的指令,让我们感觉整个计算机都是在一起跑程序,用并行好像可以提高处理能力,单车道变成上车道,单车道是串行执行,多车道并行执行,那个好,u盘早期是串口,后来变成并口又变成串口,串行和并行其实各有用途,一般来讲一个进程都会开启多线程的,但是线程绝对不是越多越好,因为线程越多,相当于维护管理成本越来越高,线程还有切换,把时间都浪费在切换上,所以很少一个进程开几千个线程,维护成本太高了,线程虽然是轻量级,但是也是有管理成本的,线程不是多多益善
在这里插入图片描述
串口并口也是一样道理的,用并口成本上升了,并口设备处理起来复杂的多,一来一回两根线搞定了,不会搞十几根线。并口的电路处理起来复杂,成本复杂,多个数据也是发一会它的,发一会其他的

串行就是只有一个线程,但是知道某一段会卡,就可以用多线程,并行

<think>好的,我现在需要帮助用户查找关于Traefik插件的使用说明、配置和示例。首先,用户提到他们想了解与Traefik插件相关的信息,特别是使用说明、配置和示例。根据用户提供的引用内容,我需要整理这些信息,并按照用户的要求进行结构化回答。 首先,我要回顾用户提供的引用内容。引用[1]提到了在静态配置文件中添加插件的配置示例,引用[3]和[5]介绍了GitHub上的示例插件demo,说明插件是通过Yaegi动态执行的,并提到了开发指南。引用[4]提到了使用Helm chart部署Traefik,这可能与插件的安装有关。引用[2]可能是一个Terraform的示例,但具体内容不明确,暂时可能用不上。 接下来,我需要确定用户的需求:他们需要知道如何配置和使用Traefik插件,包括具体的步骤和示例。根据引用内容,可以分步骤说明配置方法,比如静态配置文件中的设置,以及插件的开发或使用现有插件的步骤。可能还需要提到动态加载和注意事项,如实验性功能、版本兼容性等。 需要确保回答符合用户的要求,结构清晰,分步骤说明。同时,要引用提供的引用内容,正确标注引用标识。例如,引用[1]中的配置示例,引用[3]关于GitHub仓库的信息,引用[4]提到的Helm安装方法,以及引用[5]的项目介绍部分。 另外,用户可能对插件的实际应用场景和如何开发自己的插件感兴趣,所以可能需要包含这些信息。还要生成相关问题,如如何开发自定义插件、动态加载机制、性能影响等。 需要注意的是,用户提供的引用中有部分内容可能不直接相关,比如引用[2]的Terraform示例,但如果没有更相关的信息,可以暂时忽略。确保回答中的引用准确对应到相关的部分。 总结回答结构: 1. 插件配置步骤,包括静态配置文件示例和Helm安装。 2. 使用现有插件的步骤,比如demo插件的安装。 3. 开发自定义插件的基本流程。 4. 注意事项,如实验性功能、版本要求等。 5. 相关问题部分,生成相关问题。 现在需要将这些信息整合成自然的中文回答,正确引用来源,并确保LaTeX格式符合要求,虽然用户的问题可能不涉及数学公式,但如果有变量或代码,需要使用正确的格式。例如,配置示例中的代码块需要用反引号包裹,并注明语言类型。 检查是否有遗漏的信息,比如引用[3]提到的Yaegi解释器,可能需要解释动态加载机制。同时,引用[5]提到插件是扩展Traefik功能的强大工具,可以用于流量管理,这部分可以在应用场景中提及。 最后,生成的相关问题需要与Traefik插件的使用、开发、配置相关,确保问题有针对性,能够引导用户进一步探索。</think>### Traefik 插件使用说明与配置示例 #### 1. 插件配置基础步骤 Traefik 插件通过静态配置文件或动态加载实现。以下为静态配置示例(需在 Traefik 的 YAML 配置文件中添加): ```yaml experimental: localPlugins: example: moduleName: github.com/traefik/plugindemo # 插件模块路径[^1] ``` 此配置声明了一个名为 `example` 的本地插件,指向 GitHub 上的示例仓库[^3]。 若使用 Helm 安装 Traefik,需在 `values.yaml` 中启用插件支持: ```yaml experimental: plugins: enabled: true # 启用插件功能[^4] ``` #### 2. 使用现有插件(以 demo 插件为例) 1. **安装插件** 通过修改 Traefik 部署配置,将插件代码编译到 Traefik 二进制文件中,或通过动态加载(需 Yaegi 支持)。 2. **配置路由规则** 在 `IngressRoute` 中引用插件: ```yaml apiVersion: traefik.io/v1alpha1 kind: Middleware metadata: name: demo-plugin spec: plugin: example: # 插件名称 headerName: "X-Custom-Header" headerValue: "Hello from Plugin" ``` #### 3. 开发自定义插件 1. **代码结构** 遵循 Traefik 插件接口规范,实现 `New` 初始化方法和 `Handle` 请求处理逻辑[^3]。 2. **动态加载** 利用 Yaegi 解释器实时加载插件(无需重启 Traefik): ```go // 示例插件逻辑 func New(ctx context.Context, config *Configuration) (http.Handler, error) { return &demoPlugin{config}, nil } ``` #### 4. 注意事项 - **实验性功能**:插件功能标记为实验性,需在配置中显式启用[^4]。 - **版本兼容性**:确认 Traefik 版本支持插件(建议 v2.3+)[^4]。 - **安全限制**:动态加载插件需注意代码安全性,建议审核第三方插件[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值