多任务介绍
现实生活中
有很多的场景中的事情是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的;

想,如果把唱歌和跳舞这2件事情分开依次完成的话,估计就没有那么好的效果了(想一下场景:先唱歌,然后在跳舞,O(∩_∩)O哈哈~)

程序中
如下程序,来模拟“唱歌跳舞”这件事情

#coding=utf-8from time import sleepdef sing():for i in range(3):print("正在唱歌...%d"%i)sleep(1)def dance():for i in range(3):print("正在跳舞...%d"%i)sleep(1)if __name__ == '__main__':sing() #唱歌dance() #跳舞

运行结果如下:

注意

  • 很显然刚刚的程序并没有完成唱歌和跳舞同时进行的要求

  • 如果想要实现“唱歌跳舞”同时进行,那么就需要一个新的方法,叫做:多任务

多任务的概念

什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行。还有很多任务悄悄地在后台同时运行着,只是桌面上没有显示而已。

现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务。由于CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的呢?

答案就是操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。

真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。

注意:

  • 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)

  • 并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的

线程(重点)
python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用
1. 使用threading模块
单线程执行

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#coding=utf-8
import timedef saySorry():print("亲爱的,我错了,我能吃饭了吗?")time.sleep(1)if __name__ == "__main__":for i in range(5):saySorry()

运行结果:

多线程执行

#coding=utf-8
import threading
import timedef saySorry():print("亲爱的,我错了,我能吃饭了吗?")time.sleep(1)if __name__ == "__main__":for i in range(5):t = threading.Thread(target=saySorry)t.start() #启动线程,即让线程开始执行

运行结果:

说明

  • 可以明显看出使用了多线程并发的操作,花费时间要短很多

  • 当调用start()时,才会真正的创建线程,并且开始执行

2. 主线程会等待所有的子线程结束后才结束

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#coding=utf-8
import threading
from time import sleep,ctimedef sing():for i in range(3):print("正在唱歌...%d"%i)sleep(1)def dance():for i in range(3):print("正在跳舞...%d"%i)sleep(1)if __name__ == '__main__':print('---开始---:%s'%ctime())t1 = threading.Thread(target=sing)t2 = threading.Thread(target=dance)t1.start()t2.start()#sleep(5) # 屏蔽此行代码,试试看,程序是否会立马结束?print('---结束---:%s'%ctime())


3. 查看线程数量

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#coding=utf-8
import threading
from time import sleep,ctimedef sing():for i in range(3):print("正在唱歌...%d"%i)sleep(1)def dance():for i in range(3):print("正在跳舞...%d"%i)sleep(1)if __name__ == '__main__':print('---开始---:%s'%ctime())t1 = threading.Thread(target=sing)t2 = threading.Thread(target=dance)t1.start()t2.start()while True:length = len(threading.enumerate())print('当前运行的线程数为:%d'%length)if length<=1:breaksleep(0.5)


线程(注意点)

1. 线程执行代码的封装
通过上一小节,能够看出,通过使用threading模块能完成多任务的程序开发,为了让每个线程的封装性更完美,所以使用threading模块时,往往会定义一个新的子类class,只要继承threading.Thread就可以了,然后重写run方法

示例如下:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#coding=utf-8
import threading
import timeclass MyThread(threading.Thread):def run(self):for i in range(3):time.sleep(1)msg = "I'm "+self.name+' @ '+str(i) #name属性中保存的是当前线程的名字print(msg)if __name__ == '__main__':t = MyThread()t.start()


说明
python的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法。而创建自己的线程实例后,通过Thread类的start方法,可以启动该线程,交给python虚拟机进行调度,当该线程获得执行的机会时,就会调用run方法执行线程。

2. 线程的执行顺序

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#coding=utf-8
import threading
import timeclass MyThread(threading.Thread):def run(self):for i in range(3):time.sleep(1)msg = "I'm "+self.name+' @ '+str(i)print(msg)
def test():for i in range(5):t = MyThread()t.start()
if __name__ == '__main__':test()

执行结果:(运行的结果可能不一样,但是大体是一致的)

 I'm Thread-1 @ 0I'm Thread-2 @ 0I'm Thread-5 @ 0I'm Thread-3 @ 0I'm Thread-4 @ 0I'm Thread-3 @ 1I'm Thread-4 @ 1I'm Thread-5 @ 1I'm Thread-1 @ 1I'm Thread-2 @ 1I'm Thread-4 @ 2I'm Thread-5 @ 2I'm Thread-2 @ 2I'm Thread-1 @ 2I'm Thread-3 @ 2

说明
从代码和执行结果我们可以看出,多线程程序的执行顺序是不确定的。当执行到sleep语句时,线程将被阻塞(Blocked),到sleep结束后,线程进入就绪(Runnable)状态,等待调度。

而线程调度将自行选择一个线程执行。上面的代码中只能保证每个线程都运行完整个run函数,但是线程的启动顺序、run函数中每次循环的执行顺序都不能确定。

3. 总结

  1. 每个线程默认有一个名字,尽管上面的例子中没有指定线程对象的name,但是python会自动为线程指定一个名字。

  2. 当线程的run()方法结束时该线程完成。

  3. 无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式。

Python---多任务介绍以及Thread的基本使用相关推荐

  1. python多任务-线程

    多任务介绍 多任务就是多个程序或者函数同时运行(就是操作系统可以同时运行多个任务),比如你可以边吃饭边刷抖音边抖腿吃饭. 多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务.由于C ...

  2. python模块介绍-locustio:性能测试工具locustio

    转自:http://automationtesting.sinaapp.com/blog/m_locustio_doc python测试文章 http://weibo.com/cizhenshi?is ...

  3. python多任务编程_python线程的多任务编程

    多任务 多任务介绍 对于人来说,一边听歌,一边跳舞就是多任务. 对于电脑,简单的说,同一时间执行多个程序处理数据叫做多任务 多任务理解 单核CPU 单核cpu在处理多任务的时候是根据时间片轮转的方式进 ...

  4. python多任务,线程详解

    python 多任务 多线程 python的thread模块是⽐较底层的模块,python的threading 模块是对thread做了⼀些包装的,可以更加⽅便的被使⽤ 调用 1 直接调用 # –*– ...

  5. python模块介绍-gevent介绍:基于协程的网络库

    2019独角兽企业重金招聘Python工程师标准>>> python模块介绍-gevent介绍:基于协程的网络库 介绍 gevent是基于协程的Python网络库.特点: 基于lib ...

  6. Blender中的Python脚本介绍学习教程

    Blender中的Python脚本介绍学习教程 MP4 |视频:h264,1280×720 |音频:AAC,48000 Hz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:1.63 ...

  7. python软件界面-python软件界面介绍(python软件介绍)

    python软件界面介绍 1.接口初始化 当我们使用pycharm工具时,我们将遇到的第一个问题是,在进行各种配置后界面变得混乱时,我们该怎么办?我们应该还原,那么如何还原初始设置? 尽管此工具是从e ...

  8. python语言简介-Python语言介绍

    原标题:Python语言介绍 Python简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其 ...

  9. python语言介绍-00-python语言介绍

    以下为摘录的python的介绍 Python是一种解释型语言.这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需要编译.其他解释型语言还包括PHP和Ruby. Python是动态类型 ...

最新文章

  1. [partial] C#里partial关键字的作用
  2. 数据分析 python 用途-Python 从爬虫到数据分析
  3. 一文让你轻松了解 JAVA 开发中的四种加密方法
  4. 运行launch文件报错Roslaunch got a ‘No such file or directory‘ error while attempting to run:
  5. 【转】使用C#发送Http 请求实现模拟登陆(以博客园为例)
  6. linux支持表情的字体,让应用程序支持emoji字符
  7. 确诊新冠小米员工的活动轨迹,这就是人间真实吗?
  8. Linux下xargs命令的使用
  9. 第二阶段团队冲刺第三天
  10. 接口测试搭建之JMeter接口测试与SoapUI接口测试
  11. 显示日历信息的命令 cal 和 ncal
  12. html中所用到的英语单词怎么写,8的英语单词怎么写
  13. 【模拟】1177.正方形
  14. 算法与数据结构课后习题第七章
  15. 锐意创新,引领音视频未来
  16. 从战略到执行:业务领先模型 BLM 的第一把钥匙「差距分析」
  17. vue 报错:Templates should only be responsible for mapping the state to the UI. Avoid placing tags with
  18. H5 页面适配几种展现形式
  19. 小红伞AntiVir专区
  20. Python Pillow批量转换tif格式到jpg

热门文章

  1. 外部排序---置换选择+败者树
  2. 自己写了个nginx启动脚本,shell
  3. Android中全屏或者取消标题栏
  4. hive怎样决定reducer个数
  5. Visual Studio “类视图”和“对象浏览器”图标含义
  6. 【学习笔记】HTTPS概述
  7. 13、Power Query-逆透视列的实例(下)
  8. 返聘前任员工:效率高出新人40%!
  9. 自媒体时代的主流媒体不可替代
  10. WIN7重装IE的步骤