多线程编程threading
操作系统能够调度和切换的最小单元实际上是线程。
对于IO操作来说,多线程和多进程性能差别不大。
有两种方法可以进行多线程编程。
1.使用多线程编程的两种方法
(1)直接实例化一个Thread对象
from threading import Thread
import time def task1():
print("task1开始执行")
time.sleep(5)
print("task1执行结束") def task2():
print("task2开始执行")
time.sleep(3)
print("task2结束执行") if __name__ == "__main__":
t1 = Thread(target=task1)
t2 = Thread(target=task2)
start_time = time.time()
t1.start()
t2.start()
run_time = time.time() - start_time
print("执行时间:%s"%run_time)
执行结果:
task1开始执行
task2开始执行
执行时间:0.0009980201721191406
task2结束执行
task1执行结束
t1和t2属于并发执行,t1和t2开始之后,并不会等到执行完毕之后再执行下面的代码。
因为在t1和t2之外还有一个主线程,我们通过debug可以看的一清二楚。

在主线程结束之后,会等待其中的子线程全部执行完毕之后才会退出,不然就不会打印子线程的结果信息。
我们可以做一些设置:
t1.setDaemon(True)
执行结果:
task1开始执行
task2开始执行
执行时间:0.0009980201721191406
task2开始执行
setDaemon的意思是,将t1设置为守护线程,当主线程结束之后,守护线程也会随之结束。
如果你希望一定要等待线程执行完成,可以适用join。
from threading import Thread
import time def task1():
print("task1开始执行")
time.sleep(5)
print("task1执行结束") def task2():
print("task2开始执行")
time.sleep(3)
print("task2结束执行") if __name__ == "__main__":
t1 = Thread(target=task1)
t1.setDaemon(True) #主线程不用等待t1执行完毕之后才退出,但是依然要等待t2执行完毕。
t2 = Thread(target=task2)
start_time = time.time()
t1.start()
t2.start()
t1.join()
t2.join()
run_time = time.time() - start_time
print("执行时间:%s"%run_time) 执行结果:
task1开始执行
task2开始执行
task2结束执行
task1执行结束
执行时间:5.0016233921051025
加入join之后,不管你是否设置了守护线程,都会等到线程执行结束,才会接着往下执行。
(2)直接继承Thread类,重写run方法
from threading import Thread
import time class T1(Thread):
def run(self):
print("task1开始执行")
time.sleep(5)
print("task1执行结束") class T2(Thread):
def run(self):
print("task2开始执行")
time.sleep(3)
print("task2结束执行") if __name__ == "__main__":
t1 = T1()
t2 = T2()
t1.start()
t2.start()
t1.join()
t2.join()
print("主线程结束")
两种方式其实是一样的,一个是作为子类一个是作为对象,方法和属性基本相同。
同时我们也可以通过super调用父类的__init__方法。
在代码逻辑比较简单的时候,适用第一种方法没有什么毛病,如果逻辑比较复杂使用第二种方法当然更合适。
不管你要适用那种方法,你都是操作的一个对象,如果你想获取结果,当然应该把结果绑定到对象上去。
2.Thread中的方法一览
daemon:等于isDaemon
getName:获取线程名
ident:线程标识符
isAlive:查看线程的运行状态
isDaemon:是否是守护线程
is_alive
join:等待线程执行完毕
name:property属性,可以给线程设置name
run:线程的逻辑部分,一般会重写这个方法
setDaemon:设置守护线程
setName:设置线程名
start:开始执行线程
多线程编程threading的更多相关文章
- Python3 多线程编程 threading模块
性能自动化测试除了用jmeter还可以用python threading模块做 一.threading模块定义 Python 2.4中包含的较新的线程模块为线程提供了更强大的高级支持. 线程模块公开线 ...
- day-3 python多线程编程知识点汇总
python语言以容易入门,适合应用开发,编程简洁,第三方库多等等诸多优点,并吸引广大编程爱好者.但是也存在一个被熟知的性能瓶颈:python解释器引入GIL锁以后,多CPU场景下,也不再是并行方式运 ...
- Python:使用threading模块实现多线程编程
转:http://blog.csdn.net/bravezhe/article/details/8585437 Python:使用threading模块实现多线程编程一[综述] Python这门解释性 ...
- 转载 Net多线程编程—System.Threading.Tasks.Parallel
.Net多线程编程—System.Threading.Tasks.Parallel System.Threading.Tasks.Parallel类提供了Parallel.Invoke,Paral ...
- python多线程编程
Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...
- 5天玩转C#并行和多线程编程 —— 第五天 多线程编程大总结
5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...
- 5天玩转C#并行和多线程编程 —— 第四天 Task进阶
5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...
- 5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task
5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...
- 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq
5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...
随机推荐
- CF991E Bus Number
题意翻译 给你一个数字序列A(长度不超过18位),问有多少个序列B满足①A中所有数字都一定要在B中出现过:②B中所有数字也一定要在A中出现过:③序列B不能以0开头 输入 #1 97 输出 #1 2 解 ...
- jedis参数不当引发的问题总结
jedis参数不当引发dubbo服务线程池耗尽异常 现象:一个dubbo服务偶发性的出现个别机器甚至整个集群大量报线程池耗尽的问题.一开始对问题的处理比较粗暴,直接增加了10倍的线程数.但是问题依然偶 ...
- 查看线程CPU利用率
查看线程CPU利用率 方法1:利用ps命令查看对应的线程 1. ps -ef | grep 进程名称 2. ps -mp 进程ID -o THREAD,pid,tid,cmd,time,%cpu,%m ...
- Linux实现MYSQl数据库的定时备份
今天给大家分享一下如何在Linux下实现MYSQl数据库的定时备份. 前提需要保证你的Linux服务器已经安装了MYSQl数据库服务. 1.创建shell脚本 vim backupdb.sh 创建脚本 ...
- Windows Server 2012 R2安装部署Office Web Apps Server
微软官方参考地址https://technet.microsoft.com/zh-cn/library/jj219455.aspx,建议参考官方说明. 注意:每一步进行完成后重启服务器!!! 一. ...
- js点击按钮复制内容到粘贴板
复制内容到粘贴板,就是要选择需要复制的内容并执行document.execCommand("copy")命令: //复制内容到粘贴板 function copyToClipboar ...
- CentOS 6.5本地yum源、局域网离线yum仓库(断网情况下轻松安装各种依赖包)
在工作中, 公司的服务器大部分都禁止连接外网的,初始化系统,测试某些产品时,往往缺一些软件或依赖包,一个个上传到机器,如此浪费时间,浪费金钱,en...yum能够自动查找并解决rpm包之间的依赖关系, ...
- MYSQL 存储引擎概述
一.存储引擎 Mysql中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中每一种技术都使用了不同的存储机制,索引技巧.锁定水平并且最终提供广泛的不同功能和能力.通过选择不同的技术,你能够获得 ...
- prometheus operator 部署
prometheus operator 部署自定义记录 环境: k8s 1.11集群版本,kubeadm部署 docker 17.3.2版本 Centos 7系统 阿里云服务器 operator 源码 ...
- QT5无法定位程序输入点 于动态链接库QtCore5.dll的解决
本人新手刚接触QT5,今天在写程序时,在QtCreator中可以运行,但是单独运行.exe文件时报错 之后发现是因为我之前在path路径中添加了MinGw,导致里面也有Qt库.但是我编译的时候用的是安 ...