当前位置: 首页 > news >正文

多任务之线程

文章目录

  • 一、多任务是什么?
  • 二、多任务-线程
  • 四、通过继承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];

相关文章:

多任务之线程

文章目录一、多任务是什么&#xff1f;二、多任务-线程四、通过继承Tread类完成创建线程五、资源竞争六、同步与互斥锁七、对峙与避免死锁一、多任务是什么&#xff1f; 多个函数同时执行一件事情就是多任务&#xff0c;没有多任务的时候任务执行都是按照顺序的&#xff0c;而…...

(数字图像处理MATLAB+Python)第二章数字图像处理基础-第二节:色度学基础与颜色模型

文章目录一&#xff1a;颜色匹配二&#xff1a;CIE 1931-RGB系统三&#xff1a;CIE 1931标准色度系统四&#xff1a;CIE 1976Lab均匀颜色空间五&#xff1a;孟塞尔表色系统&#xff08;1&#xff09;孟塞尔明度(Value&#xff0c;记为V)&#xff08;2&#xff09;孟塞尔彩度(Ch…...

【华为OD机试 2023最新 】 网上商城优惠活动(C++)

文章目录 题目描述输入描述输出描述备注用例题目解析C++题目描述 某网上商场举办优惠活动,发布了满减、打折、无门槛3种优惠券,分别为: 每满100元优惠10元,无使用数限制,如100199元可以使用1张减10元,200299可使用2张减20元,以此类推;92折券,1次限使用1张,如100元,…...

记一次CentOS 8 部署packstack部署OpenStack失败案例,请直接看最后

首先你需要一台安装好CentOS8 的虚拟机&#xff0c;相关参数如图。两块网卡&#xff0c;网卡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实现图表自适应屏幕分辨率

一&#xff1a;简介 之前做项目的时候要实现echarts图表随浏览器窗口大小变化而改变&#xff0c;echarts本身提供了一个resize()方法&#xff0c;然后我们需要用一个函数实现浏览器窗口监听&#xff0c;最初我选用的是window.onresize方法&#xff0c;当页面只有一个图表时可以…...

【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一

相关链接 【2023年第十一届泰迪杯数据挖掘挑战赛】B题&#xff1a;产品订单的数据分析与需求预测 建模及python代码详解 问题一 【2023年第十一届泰迪杯数据挖掘挑战赛】B题&#xff1a;产品订单的数据分析与需求预测 建模及python代码详解 问题二 1 题目 一&#xff0e;问题…...

【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛客观题以及详细题解

题1 概念题。 USRAT&#xff1a;异步串口通信&#xff0c;常用于数据传输&#xff1b;SW-DP&#xff1a;SWD 的全称应该是 The Serial Wire Debug Port (SW-DP),也就是串行调试端口&#xff0c;是 >ARM 目前支持的两种调试端口之一&#xff1b;JTAG-DP&#xff1a;另一个调试…...

java中Map遍历的4种方式

目录 1、map.entrySet()方式 2、map.keySet()方式 3、map.values()方式 4、forEach方式 本文以如下map案例&#xff1a; Map<String, String> map new HashMap<>(); map.put("student1", "张三"); map.put("student2", "…...

GCC 编译器的主要组件和编译过程

主要组件&#xff1a; 分析器&#xff1a;分析器将源语言程序代码转换为汇编语言。因为要从一种格式转换为另一种格式&#xff08;C到汇编&#xff09;&#xff0c;所以分析器需要知道目标机器的汇编语言。 汇编器&#xff1a;汇编器将汇编语言代码转换为CPU可以执行字节码。 …...

蓝桥杯冲刺 - week2

文章目录&#x1f4ac;前言&#x1f332;day1最大和 (DP质因数分解)901. 滑雪 - 记忆化搜索&#x1f332;day21227. 分巧克力 - 二分&#x1f332;day31221. 四平方和 - 空间换时间1230. K倍区间&#x1f332;day41076. 迷宫问题 - 路径2017-迷宫-填空&#x1f332;day5848. 有…...

第十四届蓝桥杯三月真题刷题训练——第 20 天

目录 第 1 题&#xff1a;纸张尺寸 问题描述 输入格式 输出格式 样例输入1 样例输出1 样例输入 2 样例输出 2 运行限制 代码&#xff1a; 解析&#xff1a; 第 2 题&#xff1a;最大数字 第 3 题&#xff1a;全排列的价值_递推公式 问题描述 输入格式 输出格式…...

【C++】科普:C++中的浮点数怎么在计算机中表示?

这里我们以8.25这个数为例说明计算机时如何存取float类型的数据的&#xff1a; float a 8.25;引言 1. 所占位数 首先&#xff0c;明确一个概念&#xff0c;float类型的数据在常规计算机中通常占4个字节&#xff0c;也就是32位。其内存分布如图&#xff1a; 位字段说明所占位…...

Linux 多线程:多线程和多进程的对比

目录一、多进程优缺点二、多线程优缺点三、使用多执行流的场景在多任务处理中&#xff0c;我们既可以使用多进程&#xff0c;也可以使用多线程。但多进程和多线程并不是随意选择的&#xff0c;因为它们应对的场景不同&#xff0c;优缺点也不同。 一、多进程优缺点 多进程就是在…...

IO流你了解多少

IO流你了解多少 &#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目前在某公…...

【C++】C++ 11 新特性之auto关键字

文章目录类型别名的思考auto简介auto关键字的特性类型别名的思考 随着程序越来越复杂&#xff0c;程序中用到的类型也越来越复杂&#xff0c;经常体现在&#xff1a; 类型难于拼写含义不明确导致容易出错 #include <string> #include <map> int main() {std::ma…...

nodejs的后端框架egg,thinkjs,nestjs,nuxtjs,nextjs对比

1. Egg.js&#xff1a;优点&#xff1a;Egg.js是一个基于Koa的Node.js企业级应用开发框架&#xff0c;它提供了完整的开发规范和一套稳定性和安全性较高的架构体系&#xff0c;能够帮助开发者快速构建高可用、高性能的应用程序。同时&#xff0c;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深度学习实战 | 神经网络的优化难题

即使我们可以利用反向传播来进行优化&#xff0c;但是训练过程中仍然会出现一系列的问题&#xff0c;比如鞍点、病态条件、梯度消失和梯度爆炸&#xff0c;对此我们首先提出了小批量随机梯度下降&#xff0c;并且基于批量随机梯度下降的不稳定的特点&#xff0c;继续对其做出方…...

如何缩小pdf文件的大小便于上传?在线压缩pdf工具推荐

​平时在工作、学习时我们经常都需要用到pdf文件&#xff0c;那么当遇上需要将pdf压缩大小的时候&#xff0c;该使用哪种pdf压缩&#xff08;https://www.yasuotu.com/pdfyasuo&#xff09;方式呢&#xff1f;今天分享一个在线压缩pdf的方法&#xff0c;需要的小伙伴一起来了解…...

STM32 PWR电源管理与低功耗模式实战指南

1. STM32电源管理基础与实战意义 在嵌入式系统开发中&#xff0c;电源管理往往是最容易被忽视却至关重要的环节。想象一下你的智能手环如果每天都需要充电&#xff0c;或者无线传感器节点每隔几小时就要更换电池&#xff0c;这样的产品显然缺乏实用价值。STM32的PWR模块正是为解…...

如何一键备份QQ空间历史说说:完整数据备份与隐私保护指南

如何一键备份QQ空间历史说说&#xff1a;完整数据备份与隐私保护指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心那些记录青春的QQ空间说说会随着时间流逝而消失&#xf…...

PFC(5.0)模拟:GBM模型(grain- based model ) pb-sj或pb-...

PFC(5.0)模拟:GBM模型&#xff08;grain- based model &#xff09; pb-sj或pb-pb 单轴压缩。 模拟花岗岩等矿物晶体岩石&#xff0c;多种矿物晶体模型&#xff0c;其中矿物种类 数量分布可以自定义。 可以监测sj裂纹&#xff0c;和各矿物内裂纹。PFC5.0的GBM模型玩岩石破裂是真…...

双轴光伏智能跟踪系统,怎么让光伏发电效率提上来的?

做光伏相关开发和落地的朋友&#xff0c;应该都绕不开一个核心痛点&#xff1a;传统固定式光伏的光能利用率&#xff0c;一直有明显的天花板。今天就用通俗的方式&#xff0c;拆解WZ HELIO这套双轴智能跟踪系统&#xff0c;看看它是怎么解决这个行业老问题的。先搞懂核心逻辑&a…...

RWKV7-1.5B-G1A助力运维:利用Xshell脚本自动化模型部署与监控

RWKV7-1.5B-G1A助力运维&#xff1a;利用Xshell脚本自动化模型部署与监控 1. 引言 "又到周五下午4点&#xff0c;运维团队收到紧急需求——需要在10台服务器上部署最新的RWKV7-1.5B-G1A模型服务。"这样的场景对运维工程师来说再熟悉不过。传统的手动部署方式不仅耗…...

SDMatte效果对比评测:与传统抠图工具及在线API的全面比拼

SDMatte效果对比评测&#xff1a;与传统抠图工具及在线API的全面比拼 1. 开篇&#xff1a;为什么需要新的抠图方案 在数字内容创作领域&#xff0c;抠图一直是个让人又爱又恨的技术活。记得去年帮朋友做电商产品图&#xff0c;光是给20个商品抠图就花了我整整一个周末。传统工…...

intv_ai_mk11效果惊艳案例:为初创公司1小时生成完整BP商业计划书框架

intv_ai_mk11效果惊艳案例&#xff1a;为初创公司1小时生成完整BP商业计划书框架 1. 商业计划书生成效果展示 1.1 从零到完整的商业计划书 intv_ai_mk11在商业计划书生成方面展现出惊人的效率和质量。我们实测了一个真实案例&#xff1a;一家智能硬件初创公司需要准备融资用…...

Qwen3.5-2B轻量化技术解析:模型剪枝+KV Cache优化如何降低70%显存占用

Qwen3.5-2B轻量化技术解析&#xff1a;模型剪枝KV Cache优化如何降低70%显存占用 1. 轻量化模型的核心价值 在AI模型部署领域&#xff0c;大模型的资源消耗一直是阻碍其广泛应用的瓶颈。Qwen3.5-2B作为一款仅20亿参数的多模态基础模型&#xff0c;通过创新的轻量化技术实现了…...

Phi-3-mini-4k-instruct-gguf多场景:覆盖个人提效、团队协作、客户支持全链路

Phi-3-mini-4k-instruct-gguf多场景&#xff1a;覆盖个人提效、团队协作、客户支持全链路 1. 认识Phi-3-mini-4k-instruct-gguf Phi-3-mini-4k-instruct-gguf是微软Phi-3系列中的轻量级文本生成模型GGUF版本。这个开箱即用的工具特别适合处理日常工作中的文本任务&#xff0c…...

卡证检测矫正模型中小企业降本:替代万元级专用证件扫描仪方案

卡证检测矫正模型&#xff1a;中小企业降本利器&#xff0c;替代万元级专用证件扫描仪方案 1. 引言&#xff1a;一个被忽视的降本痛点 如果你在中小企业负责行政、人事或财务&#xff0c;一定对下面这个场景不陌生&#xff1a;每天要处理一堆身份证、护照、驾照的复印件或扫描…...