Shared_memory從Python3.8移植到Python3.7/3.6

TracelessLe發表於2020-11-25

前言

Python3.8中的multiprocessing模組提供了一個 SharedMemory 類,用於分配和管理多核或對稱多處理器(SMP)機器上程式間的共享記憶體。為了協助管理不同程式間的共享記憶體生命週期,multiprocessing.managers 模組也提供了一個 BaseManager 的子類: SharedMemoryManager。

在multiprocessing模組中,共享記憶體是指 “System V 型別” 的共享記憶體塊而不是 “分散式共享記憶體”。這種型別的的共享記憶體允許不同程式讀寫一片公共(或者共享)的易失性儲存區域。一般來說,程式被限制只能訪問屬於自己程式空間的記憶體,但是共享記憶體允許跨程式共享資料,從而避免通過程式間傳送訊息的形式傳遞資料。與通過磁碟、套接字或者其他要求序列化、反序列化和複製資料的共享形式相比,直接通過記憶體共享資料擁有更出色的效能。

在這裡插入圖片描述

簡而言之,Python3.8引入的共享記憶體特性可以很方便的用於多個程式訪問同一塊資料內容。

而在Python3.8前,例如Python3.7和3.6則不具有該特性。在某些情況下,我們使用的某些依賴不支援Python3.8,但是又需要用到Python3.8的共享記憶體特性,那麼這個時候可以考慮將Python3.8的共享記憶體特性移植到Python3.7/3.6中。

步驟

注:以Python3.7環境為例。

1. 下載shared_numpy工程

從Github上下載shared_numpy工程,連結地址在此

git clone https://github.com/TracelessLe/shared_numpy.git

2. 編譯

進入shared_numpy工程目錄,執行 python setup.py build_ext --inplace,會在./shared_numpy/shared_numpy/目錄下會生成_posixshmem.cpython-37m-x86_64-linux-gnu.so和其他檔案。

3. 拷貝檔案到指定目錄

shared_numpy工程目錄下的resource_tracker.py指令碼拷貝到你所安裝的python目錄multiprocessing子目錄下(例如/root/conda/envs/env_sample/lib/python3.7/multiprocessing/)。

將生成的 _posixshmem*.so 檔案拷貝到你所安裝的python目錄lib-dynload子目錄下,如:

cp ./shared_numpy/_posixshmem.cpython-37m-x86_64-linux-gnu.so ~/conda/envs/env_sample/lib/python3.7/lib-dynload

4. 拷貝資料夾到目標工程主路徑下

拷貝shared_numpy子資料夾到你需要使用shared_memory特性的目標工程主路徑下,如:

cp ./shared_numpy/shared_numpy/ ./your_project_home_directory

5. 使用

將原先在Python3.8環境中使用shared_memory的程式碼從from multiprocessing import shared_memory 改為 from shared_numpy import shared_memory。Enjoy it !

#from multiprocessing import shared_memory
from shared_numpy import shared_memory

特別感謝

基本的shared_memory功能來自Github使用者dillonalaird的工程(https://github.com/dillonalaird/shared_numpy),在此基礎上加入了Python3.8中對共享記憶體訊號量和記憶體使用的跟蹤功能(resource_tracker.py)。

在這裡插入圖片描述

參考資料

[1] multiprocessing.shared_memory — 可從程式直接訪問的共享記憶體
[2] Github - TracelessLe - shared_numpy
[3] Github - dillonalaird - shared_numpy
[4] Github - cpython/Lib/multiprocessing/shared_memory.py
[5] Github - cpython/Lib/multiprocessing/resource_tracker.py
[6] POSIX Shared Memory

相關文章