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
- web工程從TOMCAT移植到JBOSS中WebTomcat
- Vulkan移植GpuImage(三)從A到C的濾鏡GPUUI
- Socket相關程式:從Windows移植到LinuxWindowsLinux
- 把成熟的程式碼從.NET移植到MonoMono
- Vulkan移植GpuImage(四)從D到O的濾鏡GPUUI
- Vulkan移植GPUImage(五)從P到Z的濾鏡GPUUI
- 如何將三萬行程式碼從Flow移植到TypeScript?行程TypeScript
- 移植到 Python 3Python
- MVVM框架從WPF移植到UWP遇到的問題和解決方法MVVM框架
- Linux 根檔案系統的移植(從入門到精通)Linux
- 從UWP專案移植到WinUI桌面版你需要做哪些事情UI
- 移植到Windows CE 的經驗Windows
- alsa 移植到Linux3.0Linux
- oracle移植到mysql注意事項OracleMySql
- 求從DB2 移植到Oracle10g 的操作方案,感謝!DB2Oracle
- APP一鍵從iPad移植到Mac?蘋果新服務遭開發者吐槽APPiPadMac蘋果
- kettle工具從windows移植到linux上啟動報錯:\karaf/deploy does not existWindowsLinux
- ubuntu移植到嵌入式平臺Ubuntu
- 3.6
- 《不可思議之夢蝶》專案從PC版移植到Nintendo Switch經驗分享
- 如何將複雜的應用邏輯從儲存過程移植到業務層儲存過程
- 升級centos7自帶的Python2.7到Python3.8CentOSPython
- 3.0 ORACLE移植到MYSQL改造注意要點OracleMySql
- 如何把 awk 指令碼移植到 Python指令碼Python
- 移植一個抖音貼紙元件到Flutter元件Flutter
- RT-Thread移植到stm32thread
- 如何優雅的移植JavaScript元件到BlazorJavaScript元件Blazor
- 將 Win32 程式移植到 LinuxWin32Linux
- Solaris到Linux應用的移植(轉)Linux
- Steve Yegge 將 Rails 移植到 Javascript/RhinoAIJavaScript
- 資料移植到Oracle資料庫(一)Oracle資料庫
- Parquet.Net: 將 Apache Parquet 移植到 .NETApache
- Crittercism:iOS 8崩潰率已從3.6%降至2.6%iOS
- 2.12.uboot的移植2-從uboot官方標準uboot開始移植boot
- 移植Rxjs中部分常用operators到陣列JS陣列
- 如何將 Google Auto Draw 移植到小程式上Go
- 探索將scratch3移植到樹莓派樹莓派