为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容森 2023-12-12 15:01:16
我正在尝试使用匿名 mmap 在 python 进程和从 python 进程启动的 nodejs 进程之间共享内存。本质上,python 进程开始,初始化 mmap 并使用 call 或 Popen 启动子进程来启动运行某些节点代码的子进程。此nodejs代码使用mmap来尝试访问内存中的同一区域。但是我得到两个不同的映射,并且它们之间没有共享数据。为什么是这样?import mmap, math, osfrom subprocess import callmm = 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。
查看完整描述

2 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

这是一些开箱即用的示例代码!:test_mmap.py


import os, ctypes, posix_ipc, sys, mmap

from subprocess import call

SHARED_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.js


const 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!


查看完整回答
反对 回复 2023-12-12
?
智慧大石

TA贡献1946条经验 获得超3个赞

幸运的是,这不起作用:想象一下,如果所有系统的MAP_ANONYMOUS映射都针对同一区域并不断相互覆盖,那将是多么混乱。

相反,使用shm_open创建一个新句柄,您可以在两个进程中进行 mmap。这是一个可移植的包装器,围绕同样有效但可移植性较差的策略创建和映射/dev/shm/.


查看完整回答
反对 回复 2023-12-12
  • 2 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信