亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在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 關注
  • 260 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號