多任务介绍

多任务就是多个程序或者函数同时运行(就是操作系统可以同时运行多个任务),比如你可以边吃饭边刷抖音边抖腿吃饭。

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

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

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

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

代码实现

threading模块

python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用

比如以下程序,循环打印9次,每次睡眠1秒,最终运行时间相差很大

#coding=utf-8
import threading
import timedef saySorry():print("亲爱的,我错了,我能吃饭了吗?")time.sleep(1)def xunhuan():t1 = time.time()for _ in range(9):saySorry()t2 = time.time()print('循环程序运行时间:%s毫秒' % ((t2 - t1)*1000))def xiancheng():T1 = time.time()for i in range(9):t = threading.Thread(target=saySorry)# 启动线程,即让线程开始执行t.start()T2 = time.time()print('线程程序运行时间:%s毫秒' % ((T2 - T1) * 1000))xunhuan()
xiancheng()

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

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())

这段代码就是先执行sing,然后dance,如果没有多线程,dance会在sing执行完之后再执行。而现在有多线程,所以二者会同步运行。

main函数是主线程,先执行t1.start(),再t2.start(),如果没有sleep,主线程就结束了,当然子线程还会继续跑,我们一般不想让主线程结束,所以可以加个sleep先让子线程跑完,主线程再结束。

当然我们也可以加判断,就是如果程序只剩下主线程,也就是线程数为1时,我们停止程序

可以看到每次运行的结果是不一样的,这是CPU对每个线程的时间分配不一样的。

python多任务-线程相关推荐

  1. python多任务,线程详解

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

  2. Python多任务——线程

    多线程-threading python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用 1. 使用threading模块 ...

  3. python threading-单线程 多线程 主线程 子线程 setDeamon join

    python threading-单线程 多线程 主线程 子线程 setDeamon join 单线程 多线程 主线程和子线程 setDaemon() join() 测试多线程下程序运行的时间 创建多 ...

  4. Python中线程间通信

    Python中线程间通信 一.前言 二.什么是互斥锁 三.使用互斥锁 四.使用队列在线程间通信 五.关于线程需要注意的两点 一.前言   我们已经知道进程之间不能直接共享信息,那么线程之间可以共享信息 ...

  5. 〖Python〗-- 线程、进程、协程

    [线程.进程.协程] 学习进程.线程.协程,引申一些内容 为什么要学习进程和线程: 进程和线程目的是为了:提高执行效率 现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支 ...

  6. 搞事情 -- python之线程

    简介 操作系统线程理论 线程概念的引入背景 线程的特点 进程和线程的关系 使用线程的实际场景 用户级线程和内核级线程(了解) 线程和python 理论知识 线程的创建Threading.Thread类 ...

  7. Python:线程之定位与销毁

    背景 开工前我就觉得有什么不太对劲,感觉要背锅.这可不,上班第三天就捅锅了. 我们有个了不起的后台程序,可以动态加载模块,并以线程方式运行,通过这种形式实现插件的功能.而模块更新时候,后台程序自身不会 ...

  8. Python实现线程池

    Python实现线程池 最近在做一些文本处理方面的事情,考虑到程序利用并发性可以提高执行效率(不纠结特殊反例),于是入围的Idea如使用多进程或多线程达到期望的目标,对于进程或线程的创建是有代价的,那 ...

  9. Python基础---线程

    调用方式 python的线程调用有两种方式.一种是直接调用,一种是继承式调用 直接调用 import threading,time#方法一 def run(n):print(n)time.sleep( ...

最新文章

  1. 我竟然被“双亲委派”给虐了
  2. Aptana 安装jQuery库 智能提示
  3. 大型网站架构技术一览
  4. 【计算机网络(微课版)】第3章 数据链路层 课后习题及答案
  5. Boost:在GPU上对整数向量进行排序
  6. tplink 跨路由器 共享打印机_焦作联通案例分享:跨网段通过防火墙共享打印机设置...
  7. 100 个网络基础知识 看完成半个网络高手
  8. leetcode之每日温度
  9. android gson解析json
  10. asp.net pdf如何转换成tif_PDF如何转换成PPT文档?怎么使用PDF转换成PPT的软件?
  11. Hive读时模式和写时模式的区别是什么?
  12. 手撕IP核系列——Xilinx FIFO IP核-异步FIFO
  13. 5G物理信道个数和调制方式
  14. 手机客户端的推广方式(iOS/Android应用推广)
  15. 高精度数乘法进位c语言,C语言中的高精度乘法
  16. springboot学习:bean生命周期
  17. 算法梳理:随机森林算法梳理
  18. 茄子快传,中国企业海外进军的绿色通道
  19. Frontline ComProbe Protocol Analysis System(CPAS)简单使用说明
  20. QT-C++二维码生成工具(支持中文等任何字符的使用)

热门文章

  1. linux开发板 杭州迈冲,杭州迈冲科技MC9G20-DK评估开发板
  2. python中key的意思_python中的key是什么意思
  3. dateutil 日期计算_日期时间 - 日期时间工具-DateUtil - 《Hutool 参考文档》 - 书栈网 · BookStack...
  4. mysql5.7导出数据_mysql5.7导出数据时出现--secure-file-priv选项应对方法
  5. python dlib人脸检测_Python 3 利用 Dlib 实现人脸检测和剪切
  6. Django框架 day02
  7. windows+hugo+github搭建个人博客
  8. ASP.NET Core利用拦截器 IActionFilter实现权限控制
  9. struts2 过滤器和拦截器的区别和使用
  10. 鼠标移入时闪闪发光的效果