如何在python和node进程之间共享mmap

我正在尝试使用匿名 mmap 在 python 进程和从 python 进程启动的 nodejs 进程之间共享内存。本质上,python 进程开始,初始化 mmap 并使用 call 或 Popen 启动子进程来启动运行某些节点代码的子进程。此nodejs代码使用mmap来尝试访问内存中的同一区域。但是我得到两个不同的映射,并且它们之间没有共享数据。为什么是这样?


import mmap, math, os

from subprocess import call


mm = mmap.mmap( -1, 1024,

                flags=mmap.MAP_SHARED | mmap.MAP_ANONYMOUS,

                prot= mmap.PROT_READ | mmap.PROT_WRITE )



mm.seek(0)

mm.write('hello world!\n'.encode('utf-8'))




call([

    'node', '-e',

    """

const mmap = require('mmap.js');


const fileBuf = mmap.alloc(

    1024,

    mmap.PROT_READ | mmap.PROT_WRITE,

    mmap.MAP_SHARED| mmap.MAP_ANONYMOUS,

    -1,

    0

)


console.log(fileBuf.toString('utf-8'));


    """ 

])

我使用的 mmap.js 是原始 mmap c 函数的 NAPI。这是该库的 github。


慕容森
浏览 71回答 2
2回答

白板的微信

这是一些开箱即用的示例代码!:test_mmap.pyimport os, ctypes, posix_ipc, sys, mmapfrom subprocess import callSHARED_MEMORY_NAME = "/shared_memory"memory = posix_ipc.SharedMemory(SHARED_MEMORY_NAME, posix_ipc.O_CREX,                                size=1024)mapFile = mmap.mmap(memory.fd, memory.size)memory.close_fd()mapFile.seek(0)mapFile.write("Hello world!\n".encode('utf-8'))mapFile.seek(0)print("FROM PYTHON MAIN PROCESS: ", mapFile.readline().decode('utf-8'))mapFile.seek(0)call([    "node", "./test_mmap.js", SHARED_MEMORY_NAME])mapFile.close()posix_ipc.unlink_shared_memory(SHARED_MEMORY_NAME)test_mmap.jsconst args = process.argv;const mmap = require('mmap.js');const shm  = require('nodeshm');const SHM_FILE_NAME=args[args.length-1];let fd = shm.shm_open(SHM_FILE_NAME, shm.O_RDWR, 0600);if (fd == -1){    console.log("FD COULD NOT BE OPENED!");    throw "here";}let mm = mmap.alloc(1024, mmap.PROT_READ | mmap.PROT_WRITE, mmap.MAP_SHARED, fd, 0);console.log("FROM NODE: ", mm.slice(0, mm.indexOf('\n')).toString('utf-8'));示例输出:FROM PYTHON MAIN PROCESS:  Hello world!FROM NODE:  Hello world!

智慧大石

幸运的是,这不起作用:想象一下,如果所有系统的MAP_ANONYMOUS映射都针对同一区域并不断相互覆盖,那将是多么混乱。相反,使用shm_open创建一个新句柄,您可以在两个进程中进行 mmap。这是一个可移植的包装器,围绕同样有效但可移植性较差的策略创建和映射/dev/shm/.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python