线程相关概念及操作
【1】线程的概念
1.线程-->进程会得到一个内存地址,进程是资源分配的基本单位线程才是真正进程里处理数据与逻辑的东西进程---》被分配一定的资源线程---》利用进程资源处理数据与逻辑
【2】进程和线程关系:
进程与进程之间是竞争关系,竞争内存空间和资源线程和线程之间,协作关系,共同完成某个任务
【3】进程和线程开销问题
进程 > 线程
原因:一个进程相当于一个工作车间一个线程只是一个进程里的流水线线程只是在进程已经申请有的资源上进行的处理
【4】进程和线程的区别
1. 线程共享创建它的进程的地址空间; 进程具有自己的地址空间。
2.线程可以直接访问其进程的数据段; 进程具有其父进程数据段的副本。
3.线程可以直接与所在进程中的其他线程通信; 进程必须使用进程间通信与同级进程进行通信。
4.新线程很容易创建; 新进程需要复制父进程。
5.线程可以对同一进程的线程行使相当大的控制权。 进程只能控制子进程。
"""
# 创建线程---->多线程和多进程只有在阻塞的时候才能到别的地方去运行
"""
【5】创建线程的方式
方式一:
引入模块,直接创建
from threading import Thread
def work():...
if __name__ == '__main__':t1=Thread(target=work)t1.start()
方式二:
继承Thread类,重写run方法
继承了之后我的 New_Thread类他实例化的对象就是一个线程
from threading import Thread
class New_Thread(Thread):
def __init__(self):super().__init__()def run(self):print("我是线程")
if __name__ == '__main__':t=New_Thread()t.start()
【6】多线程共享数据,多进程之间的数据是隔离开的
通过例子不难发现,线程中的数据,进行修改,在其他线程中会变
但是进程中的数据却不会
from multiprocessing import Process
from threading import Thread
num=10
def work():# 由于在局部修改全局的变量,要对局部的该变量进行等级提升global numprint(f"改变前num={num}")num+=1print(f"改变后num={num}")
def main():for i in range(4):# thread=Thread(target=work)# thread.start()# thread.join()process=Process(target=work)process.start()process.join()print(f"当前num={num}")
if __name__ == '__main__':main()
【7】线程的查看的pid与ppid与进程的区别
线程的pid是他所属的进程,因为都是由同一个进程开的线程,所以他的pid是相同的,ppid相同由于是一个主进程开的进程里的线程
每个进程有每个进程的不一样的pid,但又相同的ppid
def work(name):print(f"当前{name}的pid={os.getpid()}")print(f"当前{name}的ppid={os.getppid()}")
def main():for i in range(2):# th=Thread(target=work,args=(f'线程{i+1}',))# th.start()# th.join()"""当前线程1的pid=13532当前线程1的ppid=2792当前线程2的pid=13532当前线程2的ppid=2792当前主进程的pid=13532"""p=Process(target=work,args=(f'进程{i+1}',))p.start()p.join()"""当前进程1的pid=10412当前进程1的ppid=11060当前进程2的pid=16796当前进程2的ppid=11060当前主进程的pid=11060"""print(f"当前主进程的pid={os.getpid()}")
if __name__ == '__main__':main()
【8】线程服务器并发
服务端
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
from threading import Thread
class Server():def __init__(self):self.server=socket.socket()self.server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)self.server.bind(('127.0.0.1',8080))self.server.listen(5)@staticmethoddef work(sock):while True:data=sock.recv(1024)if data.decode()=='':breakprint(data.decode())sock.send(f"你好{data.decode()}".encode())def main(self):while True:sock,addr=self.server.accept()t=Thread(target=self.work,args=(sock,))t.start()#t.join()
if __name__ == '__main__':t=Server()t.main()
客户端
import socket
client=socket.socket()
client.connect(('127.0.0.1',8080))
while True:msg=input("请输入》》:")client.send(msg.encode())data=client.recv(1024)print(data.decode())
【9】守护线程
主线程结束运行后不会马上结束,而是等待其他非守护子线程结束之后才会结束
守护子线程会跟着主线程一起死
例子
from threading import Thread
from multiprocessing import Process
import timedef foo():print(f' this is foo begin')time.sleep(1)print(f' this is foo end')def func():print(f' this is func begin')time.sleep(3)print(f' this is func end')def main():t1 = Thread(target=foo)t2 = Thread(target=func)t1.daemon = Truet1.start()t2.start()print(f' this is main')if __name__ == '__main__':main()# this is foo begin# this is func begin# this is main# this is foo end# this is func end
【十】多进程和多线程之间比较
多进程--》适合计算密集型操作
多线程--》适合IO密集型操作
相关文章:
线程相关概念及操作
【1】线程的概念 1.线程-->进程会得到一个内存地址,进程是资源分配的基本单位线程才是真正进程里处理数据与逻辑的东西进程---》被分配一定的资源线程---》利用进程资源处理数据与逻辑 【2】进程和线程关系: 进程与进程之间是竞争关系,竞…...
2024最新版若依-RuoYi-Vue3-PostgreSQL前后端分离项目部署手册教程
项目简介: RuoYi-Vue3-PostgreSQL 是一个基于 RuoYi-Vue3 框架并集成 PostgreSQL 数据库的项目。该项目提供了一套高效的前后端分离的开发解决方案,适用于中小型企业快速构建现代化的企业级应用。此项目结合了 RuoYi-Vue-Postgresql 和 RuoYi-Vue3 的优点࿰…...
PHP源码:新闻门户系统(附管理后台+前台)
一. 前言 今天小编给大家带来了一款可学习,可商用的,新闻门户系统 源码,支持二开,无加密。项目可以扩展为个人博客,和一些社交论坛网址。主要功能:支持文章管理,评论管理,分类管理等…...
15kg级弹簧刀高速巡飞无人机技术详解
弹簧刀高速巡飞无人机,作为一种先进的战术导弹系统,融合了无人机与导弹的双重特性,成为了现代战争中不可或缺的侦察与打击利器。该无人机以其小巧的外形设计、优异的性能表现和广泛的适用领域,受到了全球军事领域的广泛关注。弹簧…...
中国东方资产管理25届秋招北森测评笔试如何高分通过?真题考点分析看完这篇就够了
一、东方资管校招测评题型分析 中国东方资产管理股份有限公司(中国东方资管)的校园招聘测评题型主要包括以下几个部分: 1. **计分题,行测知识**:这部分题量大约在56-57题左右,分为不同的模块进行计时测试。…...
简写单词BC149
BC149 简写单词 题目描述输入描述:输出描述: 题目描述 规定一种对于复合词的简写方式为只保留每个组成单词的首字母,并将首字母大写后再连接在一起 比如 “College English Test”可以简写成“CET”,“Computer Science”可以简写…...
Chapter11让画面动起来——Shader入门精要学习笔记
Chapter11让画面动起来 一、Unity Shader中的内置变量(时间篇)二、纹理动画1.序列帧动画2.滚动背景 三、顶点动画1.流动的河流2.广告牌3.注意事项①批处理问题②阴影投射问题 一、Unity Shader中的内置变量(时间篇) Unity Shader…...
c++之命名空间详解(namespace)
引例 在学习之前我们首先了来看这样一个情形: 在c语言下,我们写了两个头文件:链表和顺序表的。我们会定义一个type(typedef int type)方便改变数据类型(比如将int改成char),来做到整体代换。 但是我们两个头文件里面…...
【大模型】在大语言模型的璀璨星河中寻找道德的北极星
在大语言模型的璀璨星河中寻找道德的北极星 引言一、概念界定二、隐私保护的挑战2.1 数据来源的道德考量2.2 敏感信息的泄露风险 三、偏见与歧视的隐忧3.1 训练数据的偏见传递3.2 内容生成的不公倾向 四、责任归属的模糊地带4.1 生成内容的责任界定4.2 自动化决策的伦理考量 五…...
嵌入式Linux之Uboot简介和移植
uboot简介 uboot 的全称是 Universal Boot Loader,uboot 是一个遵循 GPL 协议的开源软件,uboot是一个裸机代码,可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB 等高级功能。 也就是说,可以在没有系统的情况…...
算法整理——【贪心算法练习(1)】
上一篇博客算法整理——【贪心算法简述】-CSDN博客,我们介绍了贪心算法的基础知识,现在我们要对此进行进一步练习。 一、跳跃游戏II 例题为45. 跳跃游戏 II - 力扣(LeetCode),给定一个长度为 n 的 0 索引整数数组 nu…...
人脸识别课堂签到系统【PyQt5实现】
人脸识别签到系统 1、运用场景 课堂签到,上班打卡,进出门身份验证。 2、功能类别 人脸录入,打卡签到,声音提醒,打卡信息导出,打包成exe可执行文件 3、技术栈 python3.8,sqlite3,opencv,face_recognition,PyQt5,csv 4、流程图 1、导入库 2、编写UI界面 3、打…...
Linux dig命令常见用法
Linux dig命令常见用法 一、dig安装二、dig用法 DIG命令(Domain Information Groper命令)是常用的域名查询工具,通过此命令,你可以实现域名查询和域名问题的定位,对于网络管理员和在域名系统(DNS)领域工作的小伙伴来说,它是一个非…...
数学建模论文写作文档word
目录 1. 摘要写法1.1 确定题目与方法1.2 编写开头段落1.3 填写问题一1.4 重复步骤3填写其他问题1.5 编写结尾段落1.6 编写关键词 2. 问题重述2.1 问题背景2.2 问题提出 3. 问题分析4. 问题X模型的建立与求解5. 模型的分析5.1 灵敏度分析5.2 误差分析(主要用于预测类…...
嵌入式C语言面试相关知识——CPU、进程和线程相关(相关问题很多,会经常过来更新)
嵌入式C语言面试相关知识——CPU、进程和线程相关 一、博客声明二、自问题目——CPU相关1、什么是中断?如何处理中断?2、解释上下文切换(Context Switch)?3、在嵌入式中如何优化CPU使用? 三、自问题目——进程相关1、什么是进程&a…...
Linux学习看这一篇就够了,超超超牛的Linux基础入门
引言 小伙伴们,不管是学习c还是学习其他语言在我们学的路上都绕不过操作系统,而且,老生常谈的Linux更是每个计算机人的必修,那么我们对Linux的了解可能只是从别人那听到的简单的这个系统很牛,巴拉巴拉的,但…...
el-scrollbar组件使用踩坑记录
一、el-scrollbar和浏览器原生滚动条一起出现 问题描述 el-scrollbar组件主要用于替换浏览器原生导航条。如下图所示,使用el-scrollbar组件后,发现未能成功替换掉浏览器原生导航条,二者同时出现。 引发原因 el-scrollbar的height属性如果…...
Linux计算机结构
1.计算机设计原理 冯诺依曼体系结构 通过该结构得出:中央处理器 2.操作系统整体框架 操作系统是不会让你直接乱使用底层的各种硬件,但为了依旧能够让你使用到该资源则会给你预留一些窗口去让你与其交互(类比银行,直接小窗口交互,…...
应用进程、SurfaceFlinger进程、HWC进程 之间的关系
应用进程、SurfaceFlinger进程、HWC(Hardware Composer)进程在Android系统中扮演着重要的角色,它们之间的关系和通信流程是Android图形显示系统的核心部分。以下是这三者之间关系和通信流程的详细分析: 一、三者之间的关系 应用进…...
66.Python-web框架-Django-免费模板django-datta-able的分页的一种方式
目录 1.方案介绍 1.1实现效果 1.2django.core.paginator Paginator 类: Page 类: EmptyPage 和 PageNotAnInteger 异常: 1.3 templatetags 2.方案步骤 2.1创建一个common app 2.2创建plugins/_pagination.html 2.3 其他app的views.py查询方法 2.4在AIRecords.html里…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
