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()