SharedMemory一次性学会

SharedMemory是python3.8新增加的特性,主要使用内存共享,使用非常方便

使用文档链接:https://docs.python.org/zh-cn/3/library/multiprocessing.shared_memory.html

我们可以先新建一个对象试试:

from multiprocessing import shared_memory
shm_a = shared_memory.SharedMemory(create=True, size=10)

这个方法新开辟一个空间储存内存块,我们还可以看看里面的内容:

>>> shm_a
SharedMemory('psm_d5082db5', size=10)

我们可以看到实际上是建立一个大小为10的共享内存卡,名字为psm_d5082db5

当然名字我们可以直接打印:

>>> shm_a.name
'psm_b370a3a5'

我们还可以看看究竟这个内存块里面存的什么内容,使用buf就行,里面的内容实际初始化全为0

>>> shm_a.buf
<memory at 0x7f3af310b640>
>>> list(shm_a.buf)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

我们接下来,我们还可以直接新建一个一样的的内存块:

shm_b = shared_memory.SharedMemory(shm_a.name)

现在我们思考一个问题,这两个内存块是同一个内存块吗?

我们可以看看答案:

>>> shm_a is shm_b
False
>>> shm_a==shm_b
False

答案居然是不是同一个内存块,但是现在我们可以看看里面存的内容是不是一样的呢:

>>> shm_b.buf is shm_b.buf
True
>>> shm_b.buf==shm_b.buf
True

现在内容又是一样的了,这是怎么一回事呢?

我们可以看一个实验:

>>> id(shm_a)
139891162754352
>>> id(shm_b)
139891162754496

结果是shm_a和shm_b本来就是不同的东西,地址都不同

那为啥内容是一样的呢,我们可以画一张图:

 我们从图上看出,shm_a和shm_b是共用的一份数据,并不是是一个东西,因为他们三者的地址根本不是一样的,但是shm_a和shm_b使用的是一个内存块

我们再看看shm_a到底是什么类型,虽然看起来很像list,但是并不是:

>>> type( shm_a.buf)
<class 'memoryview'>

跟list类似,我们还有使用切片的方式获取数据:

>>> shm_a.buf[-1]
0
>>> shm_a.buf[-1]=2
>>> list(shm_a.buf)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 2]
>>> list(shm_b.buf)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 2]

至此,我们还没将共享的概念使用出来,因为我们我们最终需要在另外的进程使用这个数据,假如你在一个终端新建这些数据,但是你可以直接在另外一个终端拿到这个数据

我们可以示例一下:

我们在另外一个终端使用之前建立的内存块:

>>> existing_shm = shared_memory.SharedMemory('psm_b370a3a5')
>>> list(existing_shm.buf)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

可以看到,我们可以直接拿到

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言中的sharememory(共享内存)是一种在多个进程之间共享内存数据的机制。通过一定的方法,不同进程可以访问和共享同一片物理内存区域,实现了不同进程之间快速,高效的数据共享。 一个进程将某些内存空间标记为共享,另一个进程通过操作系统的共享内存函数获得对该内存区域的访问权限,进而实现数据的共享。共享内存相较于其他通信机制来说具有快速、高效的优点,因为不需要数据复制和进程切换等操作,数据读取和写入的速度更快,尤其是面对大规模的数据计算和并发问题时,共享内存的表现更加突出。 共享内存也存在一些缺点,主要是由于不同进程可以直接访问同一片内存,因此存在数据一致性和互斥性等问题,需要使用锁和同步机制来避免数据错误和互相影响的问题。共享内存通常应用于高并发场景,如高性能计算、数据库、进程监控和实时系统等。 总之,共享内存是C语言进行多进程间数据共享的重要机制,它提高了数据访问和交互的效率和精准度,也为进程之间相互依赖、协作提供了强有力的支持和保障。 ### 回答2: 共享内存是一种通信方式,它允许不同进程之间共享同一块物理内存空间。采用共享内存进行进程间通信,可以提高程序的运行速度和效率,同时也可以减少进程间通信的复杂度。 在共享内存机制中,多个进程可以同时访问同一块内存区域的数据,而不需要进行数据的复制或传输。这种方法可以避免数据在不同进程之间交换时产生的开销和延迟,从而更快地完成数据共享和协作。 共享内存的实现通常依赖于操作系统提供的特殊机制和标准库。在C语言中,可以使用函数库中的相关API来实现不同进程之间的共享内存交互。例如,在Linux操作系统中,可以使用fork()函数创建新进程,在父/子进程之间共享内存数据,并使用semaphore信号量来进行同步访问。 总的来说,共享内存提供了一种高效、简单和灵活的进程间通信方式。它能够满足不同程序之间的数据交换和协作需求,从而提高程序的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值