Shared_memory從Python3.8移植到Python3.7/3.6
前言
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
相關文章
- MongoDB升級--從3.4到3.6MongoDB
- Vulkan移植GpuImage(三)從A到C的濾鏡GPUUI
- Vulkan移植GPUImage(五)從P到Z的濾鏡GPUUI
- Vulkan移植GpuImage(四)從D到O的濾鏡GPUUI
- 如何將三萬行程式碼從Flow移植到TypeScript?行程TypeScript
- Linux 根檔案系統的移植(從入門到精通)Linux
- mplayer 移植到 arm 心得
- 從UWP專案移植到WinUI桌面版你需要做哪些事情UI
- 移植ffmpeg到VC環境心得
- ubuntu移植到嵌入式平臺Ubuntu
- 如何把 awk 指令碼移植到 Python指令碼Python
- RT-Thread移植到stm32thread
- 升級centos7自帶的Python2.7到Python3.8CentOSPython
- 《不可思議之夢蝶》專案從PC版移植到Nintendo Switch經驗分享
- 2.12.uboot的移植2-從uboot官方標準uboot開始移植boot
- 3.6
- 移植Rxjs中部分常用operators到陣列JS陣列
- 3.0 ORACLE移植到MYSQL改造注意要點OracleMySql
- Parquet.Net: 將 Apache Parquet 移植到 .NETApache
- 將 C++程式移植到 Android 平臺C++Android
- 如何優雅的移植JavaScript元件到BlazorJavaScript元件Blazor
- APP一鍵從iPad移植到Mac?蘋果新服務遭開發者吐槽APPiPadMac蘋果
- 探索將scratch3移植到樹莓派樹莓派
- Cornfox & Bros.如何將手遊移植到SwitchROS
- 移植一個抖音貼紙元件到Flutter元件Flutter
- 如何將 Google Auto Draw 移植到小程式上Go
- FreeRTOS移植到STM32F103步驟
- 把 Linux 移植到蘋果 M1 Mac 上Linux蘋果Mac
- Centos8 安裝python3.8CentOSPython
- Pycharm安裝dlib庫(Python3.8)PyCharmPython
- windows下python3.8安裝_01WindowsPython
- Ubuntu安裝python3.7UbuntuPython
- python3.7 檔案操作Python
- python3.7 安裝tensorflowPython
- MAC 安裝Python3.7MacPython
- 3.6總結
- 將30K行Flow程式碼移植到TypeScript - davidgomTypeScriptGo
- 虹軟人臉識別——官方 Qt Demo 移植到 LinuxQTLinux