多线程编程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#并行和多线程编 ...
随机推荐
- Spring+SpringMVC+MyBatis集成(SSM)
1.导入需要用到的jar包 <dependencies> <!--Spring核心包--> <dependency> <groupId>org.spri ...
- JZOJ
题目: 三类动物A.B.C,A吃B,B吃C,C吃A.给出K句话来描述N个动物(各属于A.B.C三类之一)之间的关系,格式及意义如下:1 X Y:表示X与Y是同类: 2 X Y:表示X吃Y.K句话中有真 ...
- kubernetes 实践二:kubectl命令使用
这里记录kubernetes学习和使用过程中的内容. CentOS7 k8s-1.13 flanneld-0.10 docker-18.06 etcd-3.3 kubectl用法概述 kubectl是 ...
- php策略模式实现简单计算器
html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- D03-R语言基础学习
R语言基础学习——D03 20190423内容纲要: 1.导入数据 (1)从键盘输入 (2)从文本文件导入 (3)从excel文件导入 2.用户自定义函数 3.R访问MySQL数据库 (1)安装R ...
- 网页中插入Flash动画(.swf)代码和常用参数设置
我们现在大部分人做网页,都是直接用DW插入flash,而且DW也是所见即所得,直接生成了相应的flash显示代码.可是我们又有多少人了解这些直接由DW生成的代码呢?其实我接触flash player标 ...
- ffmpeg 速查手册
ref : http://linux.51yip.com/search/ffmpeg ffmpeg是一个源于Linux的工具软件,是FLV视频转换器,可以轻易地实现FLV向其它格式avi.asf. m ...
- 【题解】Luogu P5398 [Ynoi2018]GOSICK
原题传送门 二次离线莫队 二次离线莫队的做法参考第十四分块(前体)的题解 我们需要考虑从(1,i)如何推到(1,i+1) 我们算过了a[i]的答案,考虑加入a[i]的贡献 我们需要在a[i]的所有约数 ...
- golang ---CPU信息
package main import ( "fmt" "github.com/StackExchange/wmi" ) type gpuInfo struct ...
- React Native 开发豆瓣评分(五)屏幕适配方案
前言 React Native 是以实际像素 dp 为单位的,这导致在不同分辨率的屏幕会有不一样的显示情况. 在原生 Android 中,可以根据不同的分辨率添加不同的样式目录,以解决不同分辨率的问题 ...