python多进程-共享内存

本文介绍使用Python的multiprocessing库中mp.Value()定义共享内存,以及如何通过mp.Lock()实现进程间同步,防止多个进程同时修改共享内存导致的数据不一致问题。

定义共享内存mp.Value()

mp.value()

如果不设置进程锁,会导致两个进程同时去改变共享内存中的变量值

定义锁,定义process时需要将锁传入进程函数

mp.Lock()
import multiprocessing as mp

def job(v, num, l):
    l.acquire() # 锁住
    for _ in range(5):
        time.sleep(0.1) 
        v.value += num # 获取共享内存
        print(v.value)
    l.release() # 释放

def multicore():
    l = mp.Lock() # 定义一个进程锁
    v = mp.Value('i', 0) # 定义共享内存
    p1 = mp.Process(target=job, args=(v,1,l)) # 需要将lock传入
    p2 = mp.Process(target=job, args=(v,3,l)) 
    p1.start()
    p2.start()
    p1.join()
    p2.join()

if __name__ == '__main__':
    multicore()

转载:莫烦python

Python 3.8中,有多种实现多进程共享内存的方法,以下为你详细介绍: ### 使用`multiprocessing.shared_memory` 在Python 3.8及以上版本,`multiprocessing.shared_memory` 模块为进程间共享内存提供了便利的方式。以下是一个简单的示例代码: ```python import multiprocessing from multiprocessing.shared_memory import SharedMemory def modify_shared_memory(shm_name, size): existing_shm = SharedMemory(name=shm_name) buffer = existing_shm.buf for i in range(size): buffer[i] = buffer[i] + 1 existing_shm.close() if __name__ == '__main__': size = 10 shm = SharedMemory(create=True, size=size) buffer = shm.buf for i in range(size): buffer[i] = i p = multiprocessing.Process(target=modify_shared_memory, args=(shm.name, size)) p.start() p.join() for i in range(size): print(buffer[i]) shm.close() shm.unlink() ``` 此方法的原理是通过创建一个共享内存对象,多个进程可以通过该对象的名称来访问同一块内存区域,实现数据的共享。但使用时需要注意Python版本必须是3.8及以上 [^1]。 ### 使用`mmap` 在Unix平台上,可以使用`mmap`模块实现多进程数据交互。`mmap`可以将文件映射到内存中,多个进程通过映射同一文件来共享内存。示例代码如下: ```python import mmap import os # 创建一个临时文件 fd = os.open('temp_file', os.O_CREAT | os.O_RDWR) # 调整文件大小 os.ftruncate(fd, 10) # 创建内存映射对象 mm = mmap.mmap(fd, 10, flags=mmap.MAP_SHARED) mm.write(b'abcdefghij') # 子进程可以通过相同的文件和映射方式访问共享内存 ``` 在Unix平台上,`flags`参数可选值包括`mmap.MAP_PRIVATE`(这段内存映射只有本进程可用)和`mmap.MAP_SHARED`(将内存映射和其他进程共享,所有映射了同一文件的进程,都能够看到其中一个所做的更改),默认值为`MAP_SHARED` [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值