python中的SharedMemory如何定义大小?

How SharedMemory in python define the size?

我在 python3.8 中有一些关于 SharedMemory 的问题,任何帮助都会很好。

问题一

SharedMemory 有一个参数 SIZE,文档告诉我单位是 byte.I 创建了一个 1 字节大小的实例,然后,让 shm.buf=bytearray[1,2,3,4] , 它可以工作而且没有任何例外!为什么?

问题二

为什么打印缓冲区是内存地址?

为什么我设置的大小是1byte,结果却显示分配了4096byte?

为什么buffer地址和buffer[3:4]地址相差3X16X16byte?

为什么buffer[3:4]地址和buffer[1:3]地址一样?

from multiprocessing import shared_memory, Process


def writer(buffer):
    print(buffer)  # output: <memory at 0x7f982b6234c0>
    buffer[:5] = bytearray([1, 2, 3, 4, 5])
    buffer[4] = 12
    print(buffer[3:4])  # output: <memory at 0x7f982b6237c0>
    print(buffer[1:3])  # output: <memory at 0x7f982b6237c0>

if __name__ == '__main__':
    shm = shared_memory.SharedMemory('my_memory', create=True, size=1)
    print(shm.size)  # output: 4096
    writer(shm.buf)
    print('shm is :', shm)  # output: shm is : SharedMemory('my_memory', size=4096)

在回答问题 2 时:

buffer[3:4] 并不像您想象的那样是数组引用。它是一个 表达式 ,它获取 buffer 的一部分并将其分配给一个新的未命名变量,您的函数打印其 ID,然后丢弃。然后 buffer[1:3] 做了类似的事情,新的未命名变量 恰巧 被分配到与 buffer[3:4] 现在消失的副本相同的内存位置,因为 Python的垃圾回收知道位置是空闲的。

如果创建切片后不丢弃它们,它们将被分配到不同的位置。试试这个:

>>> b34 = buffer[3:4]
>>> b13 = buffer[1:3]
>>> b34
<memory at 0x0000024E65662940>
>>> b13
<memory at 0x0000024E65662A00>

在这种情况下,它们位于不同的位置,因为存在引用它们的变量。

并且两者都位于 buffer 的不同位置,因为它们都是 3 个 不同的变量 ,由于它们的方式,它们仅在历史上相互关联已创建。

Python 变量不是可以用指针索引的原始内存块,认为可以像访问 C 字节数组一样直接访问它们是没有帮助的。一个特定的 Python 解释器在内部深处对你的数据做什么通常不是 Python 程序员的事。在应用程序级别,为什么有人要关心 buffer[3:4] 的存储位置和方式?

有一个很好的理由:如果你有大量的数据,你可能需要了解实现的细节,因为你有性能问题。但通常在应用程序级别的解决方案是使用像 arraypandas 这样的模块,非常聪明的人已经考虑了这些问题并提出了解决方案。

您问的不是关于 Python 的问题,而是关于特定 CPython 实现的细节的问题。如果您对这类事情感兴趣,并且没有理由不感兴趣,您可以随时阅读源代码。但目前这可能有点过于雄心勃勃。