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

问题描述

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

"$schema": "http://json-schema.org/draft-04/schema#"

我正在使用的mmap.js是原始mmap c函数的NAPI。 This is the github for this library.

编辑:

感谢“那个家伙”的回答。这是正确的。这是一些开箱即用的示例代码!: test_mmap.py

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'));

    """ 
])

test_mmap.js

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)

样本输出:

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.MAP_SHARED,fd,0);


console.log("FROM NODE: ",mm.slice(0,mm.indexOf('\n')).toString('utf-8'));

解决方法

幸运的是,这是行不通的:想象一下,如果系统的所有MAP_ANONYMOUS映射都针对同一个区域并不断相互覆盖,那将是多么令人困惑。

相反,使用shm_open创建一个可以在两个进程中映射的新句柄。这是一个可移植的包装程序,用于在/dev/shm/中创建和映射文件的同等有效但移植性较低的策略。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...