python中的多任务--线程
什么是多任务?
简单地说,就是操作系统可以同时运行多个任务。
实现多任务有多种方式,线程、进程、协程。
多任务的概念:并行和并发
并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,
实现用多个任务“一起”执行
并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的
注意:
假的多任务--->并发(时间片轮转--cpu高速轮流执行)
真的多任务--->并行(cpu一个一个单独执行)
什么是线程?
可以简单理解为同一进程中有多个计数器,每个线程的执行时间不确定,
而每个进程的时间片相等,线程是操作系统调度执行的最小单位.
线程的创建(两种)
6.1thread(target=函数名)
6.2创建一个类(继承thread方法),里边必须有run方法,创建一个实例对象,
调用start的时候,start会自动调用run方法(其他函数和方法,都在run方法里边完成)
线程的创建步骤
import threading
# 创建一个线程对象
t1 = threading.Thread(target=func_name, args=(num,), name=”子线程名字”)
# 创建一个线程并启动
t1.start()
# 等待子线程执行完毕之后再继续向下执行主线程
t1.join()
备注:主线程会等待子线程结束之后才会结束,主线程一死,子线程也会死。
线程的调度是随机的,并没有先后顺序。
主线程和子线程
了解函数的调用和指向:
target=函数()------>调用函数 ; target=函数--->指向函数
3.1调用start的时候,子线程被创建;函数运行完,子线程结束
3.2主线程运行完不会结束,会等待子线程结束后,再结束
3.3如果主线程先结束了,所有剩下的子线程会被强制结束
3.4注意:线程的是没有先后顺序的
枚举函数enumerate的用法
定义:enumerate()是python的内置函数,在字典上是枚举、列举的意思。
用途:用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,
同时列出数据和数据下标,一般用在 for 循环当中,通过threading.enumerate()就可以获取线程列表。
enumerate函数的应用(查看线程的数量):
threading.enumerate()可以创建一个线程列表,可以通过列表的长度查看线程的数量
thread和start,哪个执行时候创建对象、执行线程:
1.调用thread,不会创建线程,只是创建一个对象
2.当调用thread创建出来的实例对象的start方法的时候,才会创建线程以及让这个线程开始运行
多线程-共享全局变量
优缺点:
在一个进程内的所有线程共享全局变量,很方便在多个线程间共享数据
缺点就是,线程是对全局变量随意遂改可能造成多线程之间对全局变量的混乱
导致的问题:
如果多个线程同时对一个全局变量操作,会出现资源竞争问题,从而数据结果会不正确
注意:
target指定将来这个线程去哪个函数执行代码
args指定将来调用函数的时候,传递什么数据过去-->元祖要加 “,”
只有在修改指向的时候,才会修改全局变量
什么是同步:
同步就是协同步调,按预定的先后次序进行运行
同步的作用:
解决线程同时修改全局变量的方式
互斥锁--解决资源竞争的问题
互斥锁是怎么引入的?
当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制,
线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁
互斥锁的构建流程
某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他线程才能再次锁定该资源。
互斥锁的作用
互斥锁保证了每次只有一个线程进行写入操作,保证了多线程情况下数据的正确性。
什么是死锁:
在线程间共享多个资源的时候,如果两个线程分别占有一部分资源
并且同时等待对方的资源,就会造成死锁
如何避免死锁:(两种方法)
1.银行家算法
2.添加超时函数timeout()
python中的多任务--线程的更多相关文章
- Python中进程和线程的总体区别
Num01–>线程 线程是操作系统中能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位. 一个线程指的是进程中一个单一顺序的控制流. 一个进程中可以并发多条线程,每条线程并行 ...
- python中GIL和线程与进程
线程与全局解释器锁(GIL) 一.线程概论 1.何为线程 每个进程有一个地址空间,而且默认就有一个控制线程.如果把一个进程比喻为一个车间的工作过程那么线程就是车间里的一个一个流水线. 进程只是用来把资 ...
- python中进程、线程、协程简述
进程 python中使用multiprocessing模块对进程进行操作管理 进程同步(锁.信号量.事件) 锁 —— multiprocessing.Lock 只要用到了锁 锁之间的代码就会变成同步的 ...
- python中的多任务
多任务 什么是任务 一个电脑运行这的软件 什么是多任务 电脑同时运行着的多个软件 多任务原理 时间片的轮转 并行与并发 并发:假的多任务,多个任务共用一个核 并行:正的多任务,一个核处理一个程序 生理 ...
- Python中如何使用线程池和进程池?
进程池的使用 为什么要有进程池?进程池的概念. 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务. 那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程 ...
- python中的守护线程
什么是守护线程:在后台运行,为其他线程提供服务的线程成为守护线程. 为什么要引入守护线程: thread模块不支持守护线程的概念,当主线程退出时,所有的子线程都将终止,不管它们是否仍在工作, 如果你不 ...
- python中线程和进程(一)
目录 进程和线程 Python中的线程 1. Thread类 2. 线程的启动 3. 线程的传参 4. 线程的属性和方法 5. daemon线程和non-daemon线程 6. join方法 7. 定 ...
- Python 中多线程共享全局变量的问题
写在前面不得不看的一些P话: Python 中多个线程之间是可以共享全局变量的数据的. 但是,多线程共享全局变量是会出问题的. 假设两个线程 t1 和 t2 都要对全局变量g_num (默认是0)进行 ...
- python多任务-线程
目录 多任务的概念 线程基础 单线程执行 多线程执行 主线程会等待所有子线程结束后才结束 查看线程数量 线程-注意点 线程执行代码的封装 线程的执行顺序 总结 多任务的概念 什么叫"多任务& ...
随机推荐
- Java实现 LeetCode 147 对链表进行插入排序
147. 对链表进行插入排序 对链表进行插入排序. 插入排序的动画演示如上.从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示). 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将 ...
- Java实现 LeetCode 120 三角形最小路径和
120. 三角形最小路径和 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] ...
- Java实现 蓝桥杯 历届试题 带分数
问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...
- iOS-Core Foundation框架到Foundation桥接的三种方式
温故知新.勤总结,才能生巧!这次总结一下 :Core Foundation框架到Foundation桥接的三种方式 Foundation提供OC的基础类(像NSObject).基本数据类型等. Cor ...
- 解析HOT原理
2020-06-09 19:31:01 一.疑问 前段时间:QQ群里有人对“这个表(0,4)这行数据我做了update操作,查看索引的page数据,看到索引一直指向(0,4),用ctid='(0,4) ...
- 实验四 Linux系统C语言开发环境学习
项目 内容 这个作业属于哪个课程 Linux系统与应用 这个作业的要求在哪里 作业要求链接 学号-姓名 17041428-朱槐健 作业学习目标 1.Linux系统下C语言开发环境搭建 2.学习Linu ...
- 曹工说JDK源码(4)--抄了一小段ConcurrentHashMap的代码,我解决了部分场景下的Redis缓存雪崩问题
曹工说JDK源码(1)--ConcurrentHashMap,扩容前大家同在一个哈希桶,为啥扩容后,你去新数组的高位,我只能去低位? 曹工说JDK源码(2)--ConcurrentHashMap的多线 ...
- <WP8开发学习笔记>修改panorama全景控件的标题的大小
panorama(全景)控件非常具有WinPhone特色,但是那个巨大的标题许多时候会让人觉得违和.怎么修改它呢? 最开始想到的是加一个FontSize,结果毫无影响.╮(╯-╰)╭ <phon ...
- MySQL数据库基础知识复习
现在是2020年寒假,这也是新年写的第一篇博客,用了十几天的时间自学了数据库基础部分,想总结一下得失同时并通过写博客来复习前面学的知识点. 个人: 1.本来是计划一周学完基础部分的178p但没能完成这 ...
- jenkins初始化启动报错导致进入web页面如法安装插件
报错如下图所示: 解决方法: #1 查看网卡设置是否正确 #2 确定是否设置域名服务器 #3 查看路由表是否正常 #4 确保可用dns解析 #5 ping一下常见的公网地址