[Python] 多进程和多线程在共享资源上的区别

Python入门实战:Python的并发编程 1.背景介绍 1.1 为什么要学习并发编程? 随着互联网、物联网和云计算的普及,对大数据的需求日益增长。这些数据量的急剧增加让开发者面临巨大的计算压力。在这样的背景下,并发编程成为一种不可或缺的工具,帮助开发者解决复杂问题、提升效率。 并发编程主要分为两个层次: 阅读详情

独立与非独立的内存空间

同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源相互独立。

我们看一个简单的例子,使用多个线程/进程向同一个list内添加值。

多线程的代码这样写:

from threading import Thread, Lock
import time

def func(nums, i, lock: Lock):
    lock.acquire()                          # 打印控制台是共享资源,需要请求锁
    print(f"Thread -{i} : ", id(nums))
    lock.release()                          # 释放锁
    for x in range(3):
        time.sleep(1)
        lock.acquire()                      # nums也是共享资源,需要请求锁
        nums.append(i)
        print(f"Thread -{i} : ", nums)
        lock.release()                      # 释放锁

if __name__ == '__main__':
    lock = Lock()
    nums = []
    print("Main Thread :", id(nums))
    t_list = []
    for i in range(3):
        t = Thread(target=func, args=(nums, i, lock, ))
        t_list.append(t)
        t.start()
    for t in t_list:
        t.join()
    print("Main Thread :", nums)

输出的结果是我们想象中的结果,多个线程写入的是同一个list:

Main Thread : 2112122344008
Thread -0 :  2112122344008
Thread -1 :  2112122344008
Thread -2 :  2112122344008
Thread -0 :  [0]
Thread -1 :  [0, 1]
Thread -2 :  [0, 1, 2]
Thread -1 :  [0, 1, 2, 1]
Thread -0 :  [0, 1, 2, 1, 0]
Thread -2 :  [0, 1, 2, 1, 0, 2]
Thread -0 :  [0, 1, 2, 1, 0, 2, 0]
Thread -1 :  [0, 1, 2, 1, 0, 2, 0, 1]
Thread -2 :  [0, 1, 2, 1, 0, 2, 0, 1, 2]
Main Thread : [0, 1, 2, 1, 0, 2, 0, 1, 2]

那么我们换成多进程呢?代码稍微修改一下:

from multiprocessing import Process, Lock
import time

def func(nums, i, lock: Lock):
    lock.acquire()                          # 打印控制台是共享资源,需要请求锁
    print(f"Process -{i} : ", id(nums))
    lock.release()                          # 释放锁
    for x in range(3):
        time.sleep(1)
        lock.acquire()                      # nums也是共享资源,需要请求锁
        nums.append(i)
        print(f"Process -{i} : ", nums)
        lock.release()                      # 释放锁

if __name__ == '__main__':
    lock = Lock()
    nums = []							# 一个普通的list变量
    print("Main Process :", id(nums))
    p_list = []
    for i in range(3):
        p = Process(target=func, args=(nums, i, lock, ))
        p_list.append(p)
        p.start()
    for p in p_list:
        p.join()
    print("Main Process :", nums)

结果输出,和多线程是不同的,和我们想象中的效果不一样啊:

Main Process : 2153732646280
Process -0 :  2598231611336
Process -1 :  2290033891400
Process -2 :  2314883635464
Process -0 :  [0]
Process -1 :  [1]
Process -2 :  [2]
Process -0 :  [0, 0]
Process -1 :  [1, 1]
Process -2 :  [2, 2]
Process -0 :  [0, 0, 0]
Process -1 :  [1, 1, 1]
Process -2 :  [2, 2, 2]
Main Process : []

每个进程都具有独立的内存空间。我们使用创建子进程的时候,子进程Process替我们深度复制了传入的参数,生成了自己的进程空间。因此不同进程操作的list 并不是同一个list,而是各个子进程复制出来的list。如何在多进程中共享数据呢?这我们就要使用Python的中的管理器了。

进程管理器——不同进程中共享数据

multiprocessing.Manager 管理器提供了一种创建共享数据的方法,从而可以在不同进程中共享,甚至可以通过网络跨机器共享数据。管理器维护一个用于管理 共享对象 的服务。其他进程可以通过代理访问这些共享对象。

from multiprocessing import Process, Lock, Manager
import time

def func(nums, i, lock: Lock):
    lock.acquire()                          # 打印控制台是共享资源,需要请求锁
    print(f"Process -{i} : ", id(nums))
    lock.release()                          # 释放锁
    for x in range(3):
        time.sleep(1)
        lock.acquire()                      # nums也是共享资源,需要请求锁
        nums.append(i)
        print(f"Process -{i} : ", nums)
        lock.release()                      # 释放锁

if __name__ == '__main__':
    lock = Lock()
    nums = Manager().list([])               # 多个进程需要使用manager来传递共享变量
    print("Main Process :", id(nums))
    p_list = []
    for i in range(3):
        p = Process(target=func, args=(nums, i, lock, ))
        p_list.append(p)
        p.start()
    for p in p_list:
        p.join()
    print("Main Process :", nums)

输出结果,即便各个进程打印出来list的id不同,但是仍然是同一数据,这就是管理器的作用:

Main Process : 2511697914568
Process -2 :  2023818640072
Process -1 :  1574718126600
Process -0 :  2238624938312
Process -2 :  [2]
Process -1 :  [2, 1]
Process -0 :  [2, 1, 0]
Process -2 :  [2, 1, 0, 2]
Process -1 :  [2, 1, 0, 2, 1]
Process -0 :  [2, 1, 0, 2, 1, 0]
Process -2 :  [2, 1, 0, 2, 1, 0, 2]
Process -1 :  [2, 1, 0, 2, 1, 0, 2, 1]
Process -0 :  [2, 1, 0, 2, 1, 0, 2, 1, 0]
Main Process : [2, 1, 0, 2, 1, 0, 2, 1, 0]
处理python中多线程与多进程中的数据共享问题 主要介绍了python中多线程与多进程中的数据共享问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 立即下载

相关推荐

Verilog实现FIR滤波器

1、FIR滤波器简介 不追究FIR滤波器的深层含义,我们只关注如何实现;可以看出,FIR滤波器的本质就是延迟、系数相乘与求和,如下图: 2、设计 基于以上分析,按照三级流水实现FIR滤波器设计:信号延迟-系数相乘-求和 `timescale 1ns / 1ps module fir( input clk, input rst_n, input [3:0]din, output reg [9:0]dout ); // data reg reg [3:0]din1; reg [3:.

CLL_caicai的博客 1万+

多进程和多线程的实现及线程间的信息共享

多进程概念: 多个进程(任务)在单核CPU上,按照串行依次运行,在多核CPU上,多个进程任务可以并行。多进程的优点: 可以同时运行多个任务,程序因IO堵塞时,可以释放CPU,为其他应用程序服务,当系统有多个CPU时,可以为多个程序同时服务。多进程的缺点: 太笨重,不好管理,不好切换。 串行程序:是指程序只能在单核上运行,无法利用多个CPU; 并行程序:是指程序可以利用多个计...

qq_44486437的博客 513

【计算机三级-数据库技术】操作题大题(第1套)

从触发器的语法中可知,【1】处应该填写的是执行触发器的表,【2】处应该填写指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。使用FOR或AFTER选顶定义的触发器为后触发器,即只有在引发触发器执行的语句中的操作都已成功执行,并且所有的约束检查也成功完成后,才执行触发器。转换成新的独立的模式,模式的属性由联系本身的属性及两个实体的键构成,主键由两端实体的键组合而成。实体的转换:在从ER图转换为关系模式时,一个实体转换成一个关系模式,实体的属性就是关系模式的属性,实体的键就是关系的主键。

放纵小开爱的博客 1101

多线程之间共享哪些资源?

同一进程间的线程究竟共享哪些资源呢,而又各自独享哪些资源呢? 共享的资源有 a. 堆  由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的) b. 全局变量 它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的 c. 静态变量 虽然对于局部变量来说,它在代码中是“放”在某一函数中的,

静思致远 2万+

医疗AI新思路:为什么Graph Neural Network能改善气道分割的漏检问题?

本文探讨了Graph Neural Network(GNN)在医疗AI领域改善气道分割漏检问题的创新应用。通过分析3D UNet等传统方法的局限性,揭示了GNN在图结构建模中的独特优势,特别是在捕捉细小末梢支气管方面的突破性表现。文章详细介绍了UNet-GNN混合架构的设计原理、实验性能对比及优化方向,为CT影像分析提供了新思路。

weixin_30379531的博客 223

Unity3d实现红外热成像效果

1.将需要在红外图像中高亮的物体设置到图层PostProcessing。 2.新建一个相机CameraHighLight,设置其Culling Mask为PostProcessing,也就是在这个相机中只有PostProcessing图层的物体可见。 3.新建一个RenderTexture,命名为HightLightRt,将CameraHighLight的Target Texture设HightLightRt。 4.新建一个相机Camera2,这个相机用于显示其他物体。 接下来将CameraHigh

zouxin_88的专栏 8326

定位多线程内存越界问题实践总结

最近定位了在一个多线程服务器程序(OceanBaseMergeServer)中,一个线程非法篡改另一个线程的内存而导致程序core掉的问题。定位这个问题花了整整一周的时间,期间历经曲折,尝试了各种内存调试的办法。往往感觉就要柳暗花明了,却发现又进入了另一个死胡同。最后,使用强大的mprotect+backtrace+libsigsegv等工具成功定位了问题。整个定位过程遇到的问题和解决办法对...

weixin_34308389的博客 223

新装Win10/Win11后VMware虚拟机连不上网?手把手教你排查‘网络信息不可用’(从服务检查到网段配置)

本文详细介绍了在Windows 10/11系统上安装VMware Workstation后虚拟机无法联网的排查方法。从检查VMware NAT Service、DHCP Service等关键服务状态,到重置虚拟网络编辑器配置,再到内核设备驱动问题解决,手把手教你解决‘网络信息不可用’问题。特别针对VMCI驱动故障提供了实用解决方案,帮助用户快速恢复虚拟机网络连接。

weixin_28736335的博客 768

线程与进程之间的共享资源

线程进程的共享资源

neuzhangno的博客 4526

R语言机器学习:XGBoost线性回归模型的SHAP值

SHAP(SHapley Additive exPlanations)值是一种基于博弈论Shapley值的机器学习模型解释方法,能够解释任何模型的预测结果。其主要用途包括:1)提高模型的可解释性,帮助非技术用户理解模型预测;2)识别对模型预测最重要的特征,辅助特征选择;3)调试模型,发现预测中的异常;4)评估模型公平性,避免偏见。SHAP值的计算方法包括初始化、迭代计算、归一化和解释,常用工具如Python的shap库支持多种计算方式(如TreeSHAP、KernelSHAP等)。本文还提供了基于R语言计算

专注生信领域 3436

图数据库Neo4j面试内容整理-Neo4j的性能

在执行复杂关系查询时,Neo4j 通过图结构的高效存储和查询机制,能够比传统的关系型数据库提供更快的性能,尤其是在涉及深层关系的查询时。通过合理的配置、优化查询和使用合适的硬件,Neo4j 可以处理大规模的数据集和高并发的查询请求,满足企业级应用的需求。Neo4j 在处理图数据时,通过优化图的存储、查询和遍历等方面,提供了高效的性能,特别适合用于需要处理复杂关系和多层次连接的应用场景,如社交网络、推荐系统、知识图谱等。:Neo4j 会根据查询的结构和数据的分布自动选择最优的查询计划。

不务正业的猿 585

多进程和多线程的区别:多进程资源不共享多线程资源共享

多进程和多线程的区别:多进程资源不共享多线程资源共享 from multiprocessing import Process #多进程,资源不共享,输出为10 import time x=10 def a(): global x x=20 def b(): time.sleep(1) print(x) if name == ‘main’: p1=Process(target=a) p2=P...

QQH0326的博客 1272

《HiVT: Hierarchical Vector Transformer for Multi-Agent Motion Prediction》论文阅读之HiVT

目录摘要1.介绍2.相关工作3.方法3.1. 总体框架3.2 场景表示 3.3 分层向量Transformer3.3.1 局部编码器3.3.2 全局交互模块3.3.3 多模态未来解码器3.4 训练4.实验4.1 实验设置4.2 消融研究 4.3. 结果5.结论 准确预测周围交通参与者的未来运动对于自动驾驶车辆的安全至关重要。最近,矢量化方法由于能够捕捉交通场景中的复杂交互而在运动预测领域占据主导地位。然而,现有的方法忽略了问题的对称性并且受到昂贵的计算成本的影响,面临着在不牺牲预测性能的情况

Gavinmiaoc的博客 3337

python多线程和多进程区别_python 多线程和多进程的区别 mutiprocessing theading

多线程可以共享全局变量,多进程不能。多线程中,所有子线程的进程号相同;多进程中,不同的子进程进程号不同。#!/usr/bin/python# -*- coding:utf-8 -*-import osimport threadingimport multiprocessingcount_thread = 0count_process = 0# worker functiondef worker1(...

weixin_39710041的博客 99

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

python线程锁和进程锁

在python的多线程和多进程中,当我们需要对多线程或多进程的共享资源或对象进行修改操作时,往往会出现因cpu随机调度而导致结果和我们预期不一致的问题,这时就需要对线程或者进程加锁,以保证一个线程或进程在对共享对象进行修改时,其他的线程或进程无法访问这个对象,直至获取锁的线程的操作执行完毕后释放锁。所以,锁在多线程和多进程中起到一个同步的作用,以保护每个线程和进程必要操作的完整执行。...

S_o_l_o_n的博客 8939

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

python中多进程与多线程的详细区别

不同点 眼见的不同点 1:使用的模块不一样 ​ python提供multiprocessing用于创建多进程。 提供 threading用于创建多线程。 2:创建方式: 多线程的创建 方式1:创建threading.Thread对象 import threading def tstart(arg): print(f"{arg}running" ) if __name__ == '__main__': t1 = threading.Thread(target=tstart, args=('This is

weixin_44022374的博客 1120

python 多线程和多进程的区别 mutiprocessing theading

 多线程可以共享全局变量,多进程不能。多线程中,所有子线程的进程号相同;多进程中,不同的子进程进程号不同。 #!/usr/bin/python # -*- coding:utf-8 -*- import os import threading import multiprocessing count_thread = 0 count_process = 0 # worker functi

willhuo的专栏 1264

STM32F1与DHT11实战:从零搭建温湿度监测系统

在嵌入式开发中,GPIO控制与微秒级延时是基础且关键的技术。通过单总线协议,主机与从机之间仅需一根数据线即可完成通信,其原理依赖于精确的时序控制和GPIO模式动态切换。这种技术价值在于简化硬件连接、降低成本,广泛应用于低速传感器读取。典型应用场景包括温湿度监测、闭环控制及物联网数据采集。以STM32F1微控制器和DHT11温湿度传感器为例,结合DWT延时和超时机制,可构建稳定可靠的监测系统,并轻松扩展至远程监控与低功耗改造。

weixin_34379433的博客 416

Python 多线程与多进程的主要区别

多线程是指在一个进程中同时运行多个线程。每个线程共享进程的资源,如内存空间、文件描述符等。线程之间的切换开销较小,通信也较为方便,因为它们可以直接访问共享的数据结构。然而,由于全局解释器锁(GIL)的存在,Python 的多线程并不能真正实现 CPU 密集型任务的并行计算。多进程则是指一个程序可以同时运行多个进程。每个进程都有自己的独立内存空间,互不干扰。因此,多进程更适合处理 CPU 密集型任务,能够充分利用多核 CPU 的性能。但是,进程之间的通信和数据共享相对复杂,需要通过管道、队列等方式来实现。

2501_90726468的博客 325

速通多进程和多线程

print(f"跳舞进程是否还存在{dance_process.is_alive()}")# 获取当前进程的父进程ID。#获取当前进程的父进程ID。print("我在跳舞")# 获取当前进程的进程ID。print("我在唱歌")#获取当前进程的进程ID。# 跳舞进程是否还存在True。# 获取主进程的进程ID。#判断进程是否还在运行。#创建唱歌和跳舞进程。

qq_41661843的博客 154

10.Python标准库_多进程初步 (multiprocessing包)

Vamei博客地址:http://www.cnblogs.com/vamei/archive/2012/10/12/2721484.html 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!   我们已经见过了使用subprocess包来创建子进程,但这个包有两个很大的局限性:1) 我们总

Pre的专栏 535

Python标准库10 多进程初步 (multiprocessing包)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34203426的博客 67

多线程

多线程有两个模块:_thread(低级模块)和threading(高级模块),大多时候使用threading模块。 启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行。 import time,threading #新线程 def sss(): print('gogogogogo') n=0 while n<=5: ...

六又三分之二的阳光 145

python 线程并发 day09

目录 多线程并发 socket并发集成模块 基于多进程并发的HTTPserver day09 cookie: os.listdir(path) 功能:获取文件列表   os.path.isfile() 判断一个文件是否为普通文件 os.path.isdir()  判断一个文件是否为目录 多线程并发 threading 模块完成多线程并发 对比多进程并发 优势:资源消耗少...

时光 634
上一篇: [Python] 爬虫requests下载保存csv xlsx zip各种资源文件
下一篇: [Python] 多线程同步问题——信箱传递
Spade_
博客等级 码龄10年 918粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值