15

我试图找出一种在 python 进程之间共享内存的方法。基本上存在多个python进程需要能够读取(仅读取)和使用(无突变)的对象。现在这是使用 redis + strings + cPickle 实现的,但是 cPickle 占用了宝贵的 CPU 时间,所以我不想使用它。我在互联网上看到的大多数 python 共享内存实现似乎都需要文件和泡菜,这基本上是我已经在做的事情,而这正是我想要避免的事情。

我想知道是否有办法编写类似...基本上是内存中的python对象数据库/服务器和相应的C模块来与数据库接口?

基本上,C 模块会向服务器询问要写入对象的地址,服务器会以地址响应,然后模块会写入对象,并通知服务器具有给定键的对象已写入磁盘指定的位置。然后,当任何进程想要使用给定键检索对象时,它们只需向数据库询问给定键的内存位置,服务器将响应该位置,模块将知道如何在内存中加载该空间并将 python 对象传输回 python 进程。

这是完全不合理的还是真的很难实施?我在追求不可能的事情吗?欢迎大家提出意见。谢谢互联网。

4

4 回答 4

5

不无道理。

IPC 可以通过内存映射文件来完成。Python具有内置功能:

http://docs.python.org/library/mmap.html

只需在两个进程中映射文件,嘿-presto 你有一个共享文件。当然,您必须在两个进程中轮询它以查看发生了什么变化。而且您必须在两者之间进行合作写入。并决定您要将数据放入的格式。但这是解决问题的常见方法。

于 2012-07-02T23:45:05.423 回答
3

如果你不想腌制,multiprocessing.sharedctypes可能适合。不过,这有点低级。你得到单个值或指定类型的数组。

将数据分发给子进程的另一种方式(一种方式)是multiprocessing.Pipe. 它可以处理 Python 对象,并且它是用 C 实现的,所以我不能告诉你它是否使用酸洗。

于 2012-07-03T05:51:57.763 回答
3

从 Python 3.8 起,您可以使用multiprocessing.shared_memory.SharedMemory

于 2020-07-26T06:32:16.547 回答
1

Python 不支持独立进程之间的共享内存。你可以用 C 语言实现你自己的,或者SharedArray 在你使用 libsvm、numpy.ndarray、scipy.sparse 时使用。

pip install SharedArray
def test ():
    def generateArray ():
        print('generating')
        from time import sleep
        sleep(3)
        return np.ones(1000)
    a = Sarr('test/1', generateArray)

    # use same memory as a, also work in a new process
    b = Sarr('test/1', generateArray) 
    c = Sarr('test/1', generateArray)

import re
import SharedArray
import numpy as np

class Sarr (np.ndarray):
    def __new__ (self, name, getData):
        if not callable(getData) and getData is None:
            return None
        self.orig_name = name
        shm_name = 'shm://' + re.sub(r'[./]', '_', name)
        try:
            shm = SharedArray.attach(shm_name)
            print('[done] reuse shared memory:', name)
            return shm
        except Exception as err:
            self._unlink(shm_name)
            data = getData() if callable(getData) else getData
            shm = SharedArray.create(shm_name, data.size)
            shm[:] = data[:]
            print('[done] loaded data to shared memory:', name)
            return shm

    def _unlink (name):
        try:
            SharedArray.delete(name[len('shm://'):])
            print('deleted shared memory:', name)
        except:
            pass


if __name__ == '__main__':
    test()
于 2021-11-12T10:29:04.363 回答