gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:00:17 28 4
gpt4 key购买 nike

我正在尝试使用匿名 mmap 在 python 进程和从 python 进程启动的 nodejs 进程之间共享内存。本质上,python 进程开始,初始化 mmap 并使用 call 或 Popen 启动子进程以启动运行某些 Node 代码的子进程。此 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。 This is the github for this library.
编辑:
感谢“那个其他人”的回答。这是正确的。这是一些开箱即用的示例代码!:
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!

最佳答案

幸运的是,这不起作用:想象一下如果所有系统的 MAP_ANONYMOUS映射针对同一区域并不断相互覆盖。
相反,使用 shm_open要创建一个新句柄,您可以在两个进程中进行映射。这是一个可移植的包装器,用于在 /dev/shm/ 中创建和映射文件的同样有效但不太便携的策略。 .

关于python - 如何在python和 Node 进程之间共享mmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64452984/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com