mmxingye

导航

02 | python共享内存和信号量

进程间通信(IPC)

  1. 必要性: 进程间空间独立,资源不共享,此时在需要进程间数据传输时就需要特定的手段进行数据通信。
  2. 常用进程间通信方法

管道 消息队列 共享内存 信号 信号量 套接字

共享内存

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

posted on 2022-05-23 10:23  独立树  阅读(611)  评论(0编辑  收藏  举报