操作系统能够调度和切换的最小单元实际上是线程。
对于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的更多相关文章

  1. Python3 多线程编程 threading模块

    性能自动化测试除了用jmeter还可以用python threading模块做 一.threading模块定义 Python 2.4中包含的较新的线程模块为线程提供了更强大的高级支持. 线程模块公开线 ...

  2. day-3 python多线程编程知识点汇总

    python语言以容易入门,适合应用开发,编程简洁,第三方库多等等诸多优点,并吸引广大编程爱好者.但是也存在一个被熟知的性能瓶颈:python解释器引入GIL锁以后,多CPU场景下,也不再是并行方式运 ...

  3. Python:使用threading模块实现多线程编程

    转:http://blog.csdn.net/bravezhe/article/details/8585437 Python:使用threading模块实现多线程编程一[综述] Python这门解释性 ...

  4. 转载 Net多线程编程—System.Threading.Tasks.Parallel

    .Net多线程编程—System.Threading.Tasks.Parallel   System.Threading.Tasks.Parallel类提供了Parallel.Invoke,Paral ...

  5. python多线程编程

    Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...

  6. 5天玩转C#并行和多线程编程 —— 第五天 多线程编程大总结

    5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...

  7. 5天玩转C#并行和多线程编程 —— 第四天 Task进阶

    5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...

  8. 5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task

    5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...

  9. 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq

    5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...

随机推荐

  1. Java开发笔记(一百一十四)利用Socket传输文本消息

    前面介绍了HTTP协议的网络通信,包括接口调用.文件下载和文件上传,这些功能固然已经覆盖了常见的联网操作,可是HTTP协议拥有专门的通信规则,这些规则一方面有利于维持正常的数据交互,另一方面不可避免地 ...

  2. Python的运算符和编码

    1.格式化输出 1.有两种方式: 1.1.%的方式 addr = "我家住在%s" % ("黄土高坡") 1.2.format()的方式 addr = &quo ...

  3. linux查看进程与结束进程

    查看所有进程 ps -ef ps -ef | grep 查找的进程名 结束进程 ps -ef | grep 查找的进程名 | grep -v grep | awk '{print $2}' | xar ...

  4. Springboot 整合ApachShiro完成登录验证和权限管理

    1.前言 做一个系统最大的问题就是安全问题以及权限的问题,如何正确的选择一个安全框架对自己的系统进行保护,这方面常用的框架有SpringSecurity,但考虑到它的庞大和复杂,大多数公司还是会选择 ...

  5. 在 centos 上安装 virutalbox

    目录 简介 centos 6.x 安装 virtual box Step 1 – Add Required Yum Repositories Step 2 – Install Required Pac ...

  6. C#使用共享内存与C++进行数据交互

    现在做桌面的不多了.前端太流行了,大家都去搞前端了. 需求如下: 上层UI使用C#开发,数据采集模块使用C++开发.数据采集模块采集到的数据比较大,上层需要接收这一块数据并显示 进程间通信的方式有多种 ...

  7. System.Data.Entity.Core.EntityException: 可能由于暂时性失败引发了异常。如果您在连接到 SQL Azure 数据库,请考虑使用 SqlAzureExecutionStrategy。

    代码异常描述  ************** 异常文本 **************System.Data.Entity.Core.EntityException: 可能由于暂时性失败引发了异常.如果 ...

  8. 【BZOJ 2351】Matrix(Hash)

    题目链接 二维\(Hash\)类似二维前缀和,每一行看成一个\(h\)进制数,每一个以(1,1)为左上角的矩阵看成一个由每一行的\(Hash\)值组成的\(l\)进制数. 然后自己推推柿子就行. #i ...

  9. Manjaro 安装笔记

    双系统基本知识 [折腾日记]win10 ,ubuntu双系统安装避坑指南 Windows 下安装 Ubuntu 双系统(更新) rEFInd 总结注意点: 制作U盘启动盘一开始使用的是 Ulrstro ...

  10. 移动Web深度剖析

    随着前端技术的急速发展,随着互联网行业的日益发展,HTML5作为一种比较新型的开发技术早已经被很多大的企业所应用,通过HTML5语言可以开发适用于任何设备上的酷炫网站页面,所以HTML5的发展趋势可想 ...