02 | python共享内存和信号量
进程间通信(IPC)
- 必要性: 进程间空间独立,资源不共享,此时在需要进程间数据传输时就需要特定的手段进行数据通信。
- 常用进程间通信方法
管道 消息队列 共享内存 信号 信号量 套接字
共享内存
在 python 中的共享内存 只能在 有父子关系的这种进程之间使用; 如果是毫不相干的进程可以用 socket 通信
但是 c 中的共享内存 更加灵活 可以在毫不相干的进程之间使用;
from multiprocessing import Value,Array
obj = Value(ctype,data)
功能:开辟共享内存
参数:
ctype表示共享内存空间类型 'i' 'f' 'c'
data共享内存空间初始数据
返回值:共享内存对象obj.value 对属性的修改和查看即为 共享内存的修改查看
obj = Array(ctype ,data)
功能:开辟共享内存空间
参数:
ctype: 表示共享内存数据类型
data :整数则表示开辟空间的大小,其他数据类型表示开辟
''' value.py 开辟单一共享内存空间 注意:共享内存只能有一个值 ''' from multiprocessing import Process, Value import time import random # 创建共享内存 money = Value('i', 5000) # i 表示存储的是整数 def man(): for i in range(30): time.sleep(0.2) money.value += random.randint(1, 1000) def girl(): for i in range(30): time.sleep(0.15) money.value -= random.randint(100, 800) p1 = Process(target=man) p2 = Process(target=girl) p1.start() p2.start() p1.join() p2.join() print('一个月余额:', money.value)
''' array.py 共享内存存放一组数据 ''' from multiprocessing import Process, Array shm = Array('i', [1, 2, 3, 4]) # 放入初始值 # shm = Array('i',5) # 初始开辟 5 个空间,全为 0 # shm = Array('c',b'hello') # 字节串 可以用 shm.value 整体打印字节串 def fun(): # array 创建共享内存对象可迭代 for i in shm: print(i) shm[1]=1000 # 修改共享内存 p = Process(target=fun) p.start() p.join() # 在python 中 通过这种方式创建的进程需要主动 join() ,而通过fork 创建的进程需要 wait() for i in shm: print(i)
信号量(信号灯集)
给定一个数量对多个进程可见。多个进程都可以操作该数量增减,并根据数量值决定自己的行为。
from multiprocessing import Semaphore
sem = Semaphore ( num)
功能:创建信号量对象
参数:信号量的初始值
返回值:信号量对象sem. acquire( )将信号量减1当信号量为0时阻塞
sem. release()将信号量加1
sem.get_ _value() 获取信号量数量
''' array.py 共享内存存放一组数据 ''' from multiprocessing import Process, Semaphore from time import sleep import os # 创建信号量(最多允许3个任务同时执行) sem = Semaphore(3) # 任务函数 def handle(): sem.acquire() # 像执行必须消耗一个信号量 print("%s 执行任务" % os.getpid()) sleep(2) print("%s 执行任务完毕" % os.getpid()) sem.release() # 归还信号量 # 10个任务需要执行 for i in range(10): p = Process(target=handle) p.start()
分类:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)