多任务之线程
文章目录
- 一、多任务是什么?
- 二、多任务-线程
- 四、通过继承Tread类完成创建线程
- 五、资源竞争
- 六、同步与互斥锁
- 七、对峙与避免死锁
一、多任务是什么?
多个函数同时执行一件事情就是多任务,没有多任务的时候任务执行都是按照顺序的,而多任务的时候任务执行可以是同时的;
并行:真的多任务;
并发:假的多任务;
二、多任务-线程
import time
import threading
def sing():"""唱歌5秒"""for i in range(5):print("------正在唱歌------")time.sleep(1)
def dance():"""跳舞5秒"""for i in range(5):print("------正在跳舞------")time.sleep(1)
def main():t1=threading.Thread(target=sing)t2=threading.Thread(target=dance)t1.start()t2.start()
if __name__ =="__main__":main()

import threading
def text1():for i in range(5):print("-----test1----%d----"%i)
def text2():for i in range(5):print("-----test2----%d----"%i)#因为线程执行的过程中没有slip延时,所以先谁后谁看cpu心情
def main():t1=threading.Thread(target=text1)t2 =threading.Thread(target=text2)t1.start()t2.start()print(threading.enumerate())
if __name__ =="__main__":main()

import threading
import timedef text1():for i in range(5):print("-----test1----%d----"%i)
def text2():for i in range(5):print("-----test2----%d----"%i)#因为线程执行的过程中没有slip延时,所以先谁后谁看cpu心情
def main():t1=threading.Thread(target=text1)t2 =threading.Thread(target=text2)t1.start()time.sleep(1)#休眠(延时)t2.start()time.sleep(1) # 休眠(延时)print(threading.enumerate())
if __name__ =="__main__":main()

import threading
import time
def text1():for i in range(5):print("------text1------------%d----"%i)time.sleep(1)
#如果创建thread时执行的函数结束则意味着这个线程结束了
def text2():for i in range(10):print("-------text2-----------%d----"%i)time.sleep(1)
def main():t1=threading.Thread(target=text1)t2=threading.Thread(target=text2)t1.start()#只有在运行时才建立线程并且线程运行t2.start()while True:print(threading.enumerate)#threading.enumerate查看当前线程信息#enumerate返回值是一个元组thread_num =len(threading.enumerate())print("线程数量是%d" % thread_num)if thread_num<=1:#当只剩一个主线程的时候则退出,主线程结束则全线程结束故而主线程要等到最后,保证其他线程执行完成breaktime.sleep(1)
if __name__=="__main__":main()#主线程最后退出还有一层作用就是清理各线程留下的垃圾

四、通过继承Tread类完成创建线程
import threading
import time
class 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()#在类里面自动调用run方法并且只能调用run,如果下面还有其他方法可以在run方法内部用语句调用,不可以用“t.其他方法()”

五、资源竞争
多个线程之间是共享全局变量的,但是这里有个问题如果一个线程写一个线程读则不会出问题但是两个线程都去写就会出现问题(资源竞争)
#定义一个全局变量
import threading
import timeg_num=100
def test1():global g_numg_num+=1print("-------in test1 g_num=%d-----"%g_num)
def test2():print("-------in test2 g_num=%d-----"%g_num)
def main():t1=threading.Thread(target=test1)t2=threading.Thread(target=test2)t1.start()time.sleep(1)t2.start()time.sleep(1)print("------in main Thread g_num=%d-----"%g_num)
if __name__=="__main__":main()

#定义一个全局变量
import threading
import timedef test1(temp):temp.append(33)print("-------in test1 temp=%s-----"%str(temp))
def test2(temp):print("-------in test2 temp=%s-----"%str(temp))
g_num=[11,22]
def main():t1=threading.Thread(target=test1,args=(g_num,))#args里面一定是一个元组所以一定要写逗号t2=threading.Thread(target=test2,args=(g_num,))t1.start()time.sleep(1)t2.start()time.sleep(1)print("------in main Thread g_num=%s-----"%str(g_num))
if __name__=="__main__":main()

六、同步与互斥锁
同步概念、互斥锁解决资源竞争问题(要么不做要么做完);同步就是协同步调,按预定的先后次序运行;怎么做?互斥锁:当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制,线程同步能够保证多个线程安全访问的竞争资源,最简单的同步机制是引入互斥锁;某个线程要更改共享数据时,先将其锁定,此时资源的状态为锁定,其他线程不能更改,直到该线程释放资源,将资源的状态变成”非锁定“,其他的线程才能再次锁定该资源,互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。
#互斥锁创建mutex=threading.Lock()
#锁定mutex.acquire()
#释放mutex.release()
#定义一个全局变量
import threading
import time
g_num=0
def test1(num):global g_num#上锁,如果之前没有被上锁那么此时上锁成功#如果上锁之前已经被上锁,那么此时会堵塞在这里直到这个锁被解开mutex.acquire()for i in range(num):g_num+=1#解锁mutex.release()print("-----in test1 g_num=%d----"%g_num)def test2(num):global g_nummutex.acquire()for i in range(num):g_num+=1mutex.release()print("-----in test2 g_num=%d----"%g_num)
#创建一个互斥锁,默认是没有上锁的
mutex=threading.Lock()def main():t1=threading.Thread(target=test1,args=(100,))#args里面一定是一个元组所以一定要写逗号t2=threading.Thread(target=test2,args=(100,))t1.start()t2.start()time.sleep(3)if __name__=="__main__":main()

#定义一个全局变量
import threading
import time
g_num=0
def test1(num):global g_numfor i in range(num):mutex.acquire()g_num+=1mutex.release()print("-----in test1 g_num=%d----"%g_num)def test2(num):global g_numfor i in range(num):mutex.acquire()g_num+=1mutex.release()print("-----in test2 g_num=%d----"%g_num)
#创建一个互斥锁,默认是没有上锁的
mutex=threading.Lock()def main():t1=threading.Thread(target=test1,args=(100,))#args里面一定是一个元组所以一定要写逗号t2=threading.Thread(target=test2,args=(100,))t1.start()t2.start()time.sleep(3)if __name__=="__main__":main()

七、对峙与避免死锁
当多个线程同时遇到死锁问题时可能产生对峙现象,为了避免死锁有两种解决方法:1、程序设计时尽量避免(银行家算法)2、添加超时时间等;
银行家算法:
设Request(i)是进程Pi的请求向量,如果Request(i)[j]=k,表示进程Pi需要K个R(j)类型的资源。当Pi发现资源请求后系统将进行下列步骤
(1)如果Request(i)[j] <= Need[i,j],边转向步骤2),否则认为出错,因为它所请求的资源数已超过它所宣布的最大值。
(2)如果Request(i)[j] <= Available[i,j],便转向步骤3),否则,表示尚无足够资源,Pi需等待。
(3)系统试探着把资源分配给进程Pi,并需要修改下面数据结构中的数值;
Available[j] = Available[j] - Request(i)[j];
Allocation[i,j] = Allocation[i,j] + Request(i)[j];
Need[i,j] = Need[i,j] - Request(i)[j];
相关文章:
多任务之线程
文章目录一、多任务是什么?二、多任务-线程四、通过继承Tread类完成创建线程五、资源竞争六、同步与互斥锁七、对峙与避免死锁一、多任务是什么? 多个函数同时执行一件事情就是多任务,没有多任务的时候任务执行都是按照顺序的,而…...
(数字图像处理MATLAB+Python)第二章数字图像处理基础-第二节:色度学基础与颜色模型
文章目录一:颜色匹配二:CIE 1931-RGB系统三:CIE 1931标准色度系统四:CIE 1976Lab均匀颜色空间五:孟塞尔表色系统(1)孟塞尔明度(Value,记为V)(2)孟塞尔彩度(Ch…...
【华为OD机试 2023最新 】 网上商城优惠活动(C++)
文章目录 题目描述输入描述输出描述备注用例题目解析C++题目描述 某网上商场举办优惠活动,发布了满减、打折、无门槛3种优惠券,分别为: 每满100元优惠10元,无使用数限制,如100199元可以使用1张减10元,200299可使用2张减20元,以此类推;92折券,1次限使用1张,如100元,…...
记一次CentOS 8 部署packstack部署OpenStack失败案例,请直接看最后
首先你需要一台安装好CentOS8 的虚拟机,相关参数如图。两块网卡,网卡1 NAT IP 192.168.100.100 GW192.168.100.2 网卡2 可不做配置。能ping通百度。创建完成虚拟机记得打好快照。 开机编辑基本配置环境变量 [rootlocalhost ~]# nmcli connection show NA…...
【2023春招】美团技术岗笔试10min+AK
随手投递了前端&移动端,笔试2道算法+选择+行测题(为什么笔试会有行测题?) 目录 T1-火车栈结构 题意 输入描述 输出描述 样例 AC_Code T2-春游...
Echarts实现图表自适应屏幕分辨率
一:简介 之前做项目的时候要实现echarts图表随浏览器窗口大小变化而改变,echarts本身提供了一个resize()方法,然后我们需要用一个函数实现浏览器窗口监听,最初我选用的是window.onresize方法,当页面只有一个图表时可以…...
【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一
相关链接 【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一 【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题二 1 题目 一.问题…...
【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛客观题以及详细题解
题1 概念题。 USRAT:异步串口通信,常用于数据传输;SW-DP:SWD 的全称应该是 The Serial Wire Debug Port (SW-DP),也就是串行调试端口,是 >ARM 目前支持的两种调试端口之一;JTAG-DP:另一个调试…...
java中Map遍历的4种方式
目录 1、map.entrySet()方式 2、map.keySet()方式 3、map.values()方式 4、forEach方式 本文以如下map案例: Map<String, String> map new HashMap<>(); map.put("student1", "张三"); map.put("student2", "…...
GCC 编译器的主要组件和编译过程
主要组件: 分析器:分析器将源语言程序代码转换为汇编语言。因为要从一种格式转换为另一种格式(C到汇编),所以分析器需要知道目标机器的汇编语言。 汇编器:汇编器将汇编语言代码转换为CPU可以执行字节码。 …...
蓝桥杯冲刺 - week2
文章目录💬前言🌲day1最大和 (DP质因数分解)901. 滑雪 - 记忆化搜索🌲day21227. 分巧克力 - 二分🌲day31221. 四平方和 - 空间换时间1230. K倍区间🌲day41076. 迷宫问题 - 路径2017-迷宫-填空🌲day5848. 有…...
第十四届蓝桥杯三月真题刷题训练——第 20 天
目录 第 1 题:纸张尺寸 问题描述 输入格式 输出格式 样例输入1 样例输出1 样例输入 2 样例输出 2 运行限制 代码: 解析: 第 2 题:最大数字 第 3 题:全排列的价值_递推公式 问题描述 输入格式 输出格式…...
【C++】科普:C++中的浮点数怎么在计算机中表示?
这里我们以8.25这个数为例说明计算机时如何存取float类型的数据的: float a 8.25;引言 1. 所占位数 首先,明确一个概念,float类型的数据在常规计算机中通常占4个字节,也就是32位。其内存分布如图: 位字段说明所占位…...
Linux 多线程:多线程和多进程的对比
目录一、多进程优缺点二、多线程优缺点三、使用多执行流的场景在多任务处理中,我们既可以使用多进程,也可以使用多线程。但多进程和多线程并不是随意选择的,因为它们应对的场景不同,优缺点也不同。 一、多进程优缺点 多进程就是在…...
IO流你了解多少
IO流你了解多少 🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在某公…...
【C++】C++ 11 新特性之auto关键字
文章目录类型别名的思考auto简介auto关键字的特性类型别名的思考 随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在: 类型难于拼写含义不明确导致容易出错 #include <string> #include <map> int main() {std::ma…...
nodejs的后端框架egg,thinkjs,nestjs,nuxtjs,nextjs对比
1. Egg.js:优点:Egg.js是一个基于Koa的Node.js企业级应用开发框架,它提供了完整的开发规范和一套稳定性和安全性较高的架构体系,能够帮助开发者快速构建高可用、高性能的应用程序。同时,Egg.js还提供了很多自定义插件和…...
SpringBoot @SpringBootTest 无法启动服务
这几天在看Hikari、Druid连接池。按照网上代码写Junit测试类。当时代码如下: package com.ceaning.crudp.utils;import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; impo…...
PyTorch深度学习实战 | 神经网络的优化难题
即使我们可以利用反向传播来进行优化,但是训练过程中仍然会出现一系列的问题,比如鞍点、病态条件、梯度消失和梯度爆炸,对此我们首先提出了小批量随机梯度下降,并且基于批量随机梯度下降的不稳定的特点,继续对其做出方…...
如何缩小pdf文件的大小便于上传?在线压缩pdf工具推荐
平时在工作、学习时我们经常都需要用到pdf文件,那么当遇上需要将pdf压缩大小的时候,该使用哪种pdf压缩(https://www.yasuotu.com/pdfyasuo)方式呢?今天分享一个在线压缩pdf的方法,需要的小伙伴一起来了解…...
Ubuntu系统资源监控实战:从命令行到图形化工具全解析
1. 为什么需要监控Ubuntu系统资源? 刚装好的Ubuntu系统跑得飞快,用着用着突然发现电脑变卡了?浏览器开多几个标签页就开始转圈?这种情况我遇到过太多次了。后来才发现,很多时候是因为某个程序偷偷吃掉了大量CPU或内存资…...
Linux系统CPU负载与使用率详解及性能监控
1. CPU负载与CPU使用率的本质区别在Linux系统监控和性能调优过程中,CPU负载和CPU使用率这两个指标经常被混淆使用。作为系统管理员,我曾多次遇到团队成员将这两个概念混为一谈的情况,这往往导致对系统性能问题的误判。让我们先从一个实际案例…...
springboot+vue基于web的演唱会音乐会购票管理系统设计系统
目录同行可拿货,招校园代理 ,本人源头供货商系统功能模块分析技术架构设计核心业务流程安全防护措施项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 系统功能模块分析 用户模块 注册登…...
掌握TegraRcmGUI:从入门到精通的Switch注入实践指南
掌握TegraRcmGUI:从入门到精通的Switch注入实践指南 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款基于C开发的图形化界面工具…...
实战指南:在快马平台用trae构建电商购物车状态管理系统
今天想和大家分享一个实战项目:用trae在电商场景下构建购物车状态管理系统。这个方案特别适合需要清晰数据流的中小型项目,比如电商平台、管理后台等。下面我会详细拆解整个实现过程,希望能给有类似需求的同学一些参考。 项目结构设计 首先…...
SPM12实战:从nii文件元数据解析到精准slice timing配置
1. 理解nii文件与slice timing的基础概念 当你第一次拿到fMRI的nii格式数据时,可能会被这个黑箱般的文件格式搞得一头雾水。nii文件就像是把整个大脑扫描过程打包成一个数字包裹,里面不仅包含三维的脑部图像数据,还隐藏着关键的扫描参数。我在…...
Mermaid Live Editor:代码驱动图表设计的终极解决方案
Mermaid Live Editor:代码驱动图表设计的终极解决方案 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor…...
Nunchaku-flux-1-dev参数详解:CFG Scale、种子数等关键参数实战影响
Nunchaku-flux-1-dev参数详解:CFG Scale、种子数等关键参数实战影响 你是不是也遇到过这样的情况:用同一个模型,别人生成的图片细节满满、创意十足,而你生成的却总是差点意思,要么太放飞自我,要么又过于死…...
阿里千问,有个海外版
阿里千问,有个海外版。我也是最近才知道,用了一下,发现审核尺度明显要宽松很多,国内的千问明显被约束很多,就是个半残品。据说啊,国际版千问的部分数据放在了新加坡,对标的是ChatGPT。好像现在阿…...
Zotero Citation插件开发指南:从环境适配到定制优化的全流程实践
Zotero Citation插件开发指南:从环境适配到定制优化的全流程实践 【免费下载链接】zotero-citation Make Zoteros citation in Word easier and clearer. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-citation 问题发现:学术写作中的引用…...
