multiprocessing.Pool 中的 pickle 詳解

前言:

在 Python 的 multiprocessing.Pool 中,任務和數據需要通過序列化(pickle)傳遞給子進程。pickle 是 Python 的內置序列化模塊,用于將 Python 對象轉換為字節流,以便在進程間通信時傳遞。然而,pickle 有一些限制,某些對象(例如 _thread.lock)無法被序列化,這會導致 TypeError: cannot pickle ‘_thread.lock’ object 的錯誤。

pickle 的工作原理

序列化過程:

主進程將任務(函數和參數)序列化為字節流,通過 IPC(進程間通信)發送到子進程。
子進程接收到字節流后,反序列化(unpickle)并執行任務。

支持的對象類型:

基本數據類型(如 int、float、str)。
容器類型(如 list、dict、tuple)。
類實例(如果類定義在模塊的頂層)。
函數(如果定義在模塊的頂層)。

限制:

某些對象(如 _thread.lock、文件句柄、套接字等)無法被序列化,因為它們與操作系統資源相關聯。
類方法隱式傳遞 self,其中可能包含不可序列化的屬性。

msgpack 和 dill 對比 pickle 的不同

1. msgpack

msgpack 是一種高效的二進制序列化格式,適合跨語言通信,但它不支持序列化復雜的 Python 對象(如函數、類實例)。

優點:

高效的二進制格式,序列化速度快。
支持跨語言通信(如 Python 和 C++)。
適合簡單數據類型(如 int、float、list、dict)。

缺點:

不支持序列化 Python 的復雜對象(如函數、類實例)。

示例:
import msgpackdata = {"key": "value", "number": 42}
packed = msgpack.packb(data)  # 序列化
unpacked = msgpack.unpackb(packed)  # 反序列化
print(unpacked)  # 輸出: {'key': 'value', 'number': 42}

2. dill

dill 是 pickle 的擴展版本,支持序列化更多類型的 Python 對象,包括函數、類實例、線程鎖等。

優點:

支持序列化 Python 的復雜對象(如函數、類實例、線程鎖)。
與 pickle 接口兼容,易于替換。

缺點:

序列化速度比 pickle 稍慢。
不適合跨語言通信。

示例:
import dilldef example_function(x):return x * 2serialized = dill.dumps(example_function)  # 序列化
deserialized = dill.loads(serialized)  # 反序列化
print(deserialized(5))  # 輸出: 10

解決 _thread.lock 的問題

方法 1: 使用 dill 替代 pickle

dill 可以序列化 _thread.lock 等復雜對象,直接替換 pickle 即可解決問題。

安裝:
pip install dill
代碼示例:
import multiprocessing
import dillmultiprocessing.Pool = multiprocessing.get_context("fork").Pool
multiprocessing.get_context("fork").Pickler = dill.Picklerdef run_task(lock):print("Task executed with lock:", lock)if __name__ == "__main__":lock = multiprocessing.Lock()with multiprocessing.Pool(processes=2) as pool:pool.map(run_task, [lock])  # 使用 dill 序列化 lock

方法 2: 移除不可序列化的屬性

如果使用 pickle,可以避免傳遞不可序列化的對象。例如,將 _thread.lock 從類屬性中移除。

代碼示例:
class Example:def __init__(self):self.lock = threading.Lock()  # 不可序列化def run(self):print("Task executed")example = Example()
example.lock = None  # 移除不可序列化的屬性
with multiprocessing.Pool(processes=2) as pool:pool.map(example.run, range(2))

方法 3: 使用 multiprocessing.Process

如果任務函數必須使用不可序列化的對象,可以使用 multiprocessing.Process 手動管理進程,而不是使用 Pool。

代碼示例:
from multiprocessing import Process, Lockdef run_task(lock):print("Task executed with lock:", lock)if __name__ == "__main__":lock = Lock()processes = [Process(target=run_task, args=(lock,)) for _ in range(2)]for p in processes:p.start()for p in processes:p.join()

總結

pickle 是 Python 的默認序列化工具,但有序列化限制。
msgpack 適合跨語言通信,但不支持復雜 Python 對象。
dill 是 pickle 的擴展,支持序列化更多類型的對象(包括 _thread.lock)。
推薦使用 dill 或移除不可序列化的屬性來解決 multiprocessing.Pool 中的序列化問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89486.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89486.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89486.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java集合框架體系詳解:List/Set/Map接口對比與核心實現原理

一、集合框架核心接口對比 1.1 List/Set/Map接口特性接口類型特性描述典型實現List有序可重復,支持索引訪問ArrayList/LinkedListSet無序不可重復,基于哈希表或樹實現HashSet/TreeSetMap鍵值對存儲,鍵唯一值可重復HashMap/TreeMap核心差異&am…

LeafletJS 進階:GeoJSON 與動態數據可視化

引言 LeafletJS 作為一個輕量、靈活的 JavaScript 地圖庫,以其對 GeoJSON 數據格式的強大支持而聞名。GeoJSON 是一種基于 JSON 的地理數據格式,能夠表示點(Point)、線(LineString)、多邊形(Po…

【STM32實踐篇】:F407 時鐘系統

文章目錄1. 時鐘與啟動2. CubeMX 時鐘樹2.1 時鐘源2.2 PLL 鎖相環2.3 時鐘分發與選擇2.4 頻率限制1. 時鐘與啟動 復位默認時鐘:系統復位后,CPU 時鐘默認由 16MHz 內部 RC 振蕩器(HSI)提供,該 RC 振蕩器經工廠校準&…

純前端html實現圖片坐標與尺寸(XY坐標及寬高)獲取

純前端html實現圖片坐標與尺寸&#xff08;XY坐標及寬高&#xff09;獲取。用于證書圖片或pdf打印的坐標測定。 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>純html前端實現圖片坐標與尺寸&am…

飛睿UWB超寬帶定位測距技術,數字鑰匙重塑智能生活,高精度厘米級定位無感解鎖

最近&#xff0c;數字鑰匙領域動作頻頻&#xff0c;科技巨頭與車企正掀起一波創新浪潮。小米15S Pro搭載恩智浦UWB芯片&#xff0c;用戶靠近閘機即可無感通行深圳云巴一號線&#xff0c;輕觸小米YU7車門自動解鎖&#xff0c;實現手機-汽車-公共交通的無縫數字鑰匙生態。在智能家…

基于springboot+vue+mysql平臺的醫療病歷交互系統(源碼+論文)

一、開發環境 相關技術介紹 B/S模式分析 C/S模式&#xff1a;主要由客戶應用程序(Client)、服務器管理程序(Server)和中間件(middleware)三個部件組成。客戶應用程序是系統中用戶與數據組件交互。服務器程序負責系統資源&#xff0c;如管理信息數據庫的有效管理。中間件負責連…

arm架構,arm內核,處理器之間的關系

一、情景分析 我們經常說&#xff0c;stm32f103是采用cotex-M3內核&#xff0c;基于armv7架構設計的。 那么&#xff0c;stm32f103、cotex-M3、armv7之間有什么關系呢&#xff1f; 二、層次分析 1. 架構&#xff08;Architecture&#xff09; 定義&#xff1a;架構是處理器…

基于PHP的招投標系統_603gk

目錄具體實現截圖課程項目技術路線開發技術介紹PHP核心代碼部分展示系統測試詳細視頻演示/源碼獲取具體實現截圖 課程項目技術路線 招投標系統后端采用 PHP 語言搭配Thinkphp或者 Laravel 框架&#xff0c;PHP 語法簡潔且功能強大&#xff0c;Laravel 或者Thinkphp框架能優化代…

深入解析 JavaScript 中的 `$.ajax()`:專業指南與實戰示例

文章目錄一、為什么需要 $.ajax()&#xff1f;二、核心語法解析三、關鍵參數深度剖析四、實戰示例&#xff1a;從基礎到進階五、錯誤處理最佳實踐六、性能與安全優化七、現代替代方案對比八、總結作為網站編輯&#xff0c;我將帶您深入剖析 jQuery 的 $.ajax() 方法。本文不僅涵…

Flutter 前端開發中的常見問題全面解析

Flutter 開發中的常見問題全面解析一篇給 Flutter 開發者「靈兒」里里外外都能看的問題項。從基礎開發到打包上線&#xff0c;每一步都充滿坑&#xff0c;我們詳細列出「環環盜光」的那些場景和解決思路&#xff01;【基礎系統】開發環境問題 1. flutter doctor 報錯 常見錯誤:…

STM32 單片機的停車場管理系統設計與實現

基于 STM32 的停車場管理系統設計與實現摘要隨著城市汽車保有量的快速增長&#xff0c;停車場管理的效率與智能化水平愈發重要。本文設計并實現了一套基于 STM32 單片機的停車場管理系統&#xff0c;整合車輛檢測、車位引導、計費管理及信息交互等功能。系統以 STM32 為控制核心…

STM32 寫選項字 關鍵要加載HAL_FLASH_OB_Launch

AI亂寫&#xff0c;還是得自己來&#xff01;void Write_OptionBytes_IWDG_STDBY(void) {FLASH_OBProgramInitTypeDef OBInit;HAL_FLASHEx_OBGetConfig(&OBInit); // 獲取當前選項字節配置[6,7](ref)// 檢查當前nRST_STDBY位&#xff08;IWDG_STDBY相關位&#xff09;是否…

153.在 Vue 3 中使用 OpenLayers + Cesium 實現 2D/3D 地圖切換效果

&#x1f3ac; 效果演示截圖 ? 前言 在實際項目開發中&#xff0c;我們經常需要提供「二維地圖 三維地形」的可視化效果切換&#xff0c;例如&#xff1a; 智慧農業展示耕地分布 三維地形起伏&#xff1b; 智慧城市展示建筑物點位 三維城市&#xff1b; 數字孿生場景中&…

純C++11實現!零依賴貝葉斯情感分析系統,掌握機器學習系統工程化的秘密!

本文深度剖析了一個完全基于C++11標準庫實現的貝葉斯情感分析系統。該系統采用模塊化設計,實現了從文本預處理、特征提取到樸素貝葉斯分類的完整機器學習流水線。 1. 系統架構概覽 1.1 技術棧選擇與設計哲學 該系統完全采用C++11標準庫實現,無任何外部依賴,體現了"純…

Android原生Dialog

在原生android里面&#xff0c;有兩種dialog寫法&#xff0c;一種是直接使用里面提供的AlertDialog.Builder方法去使用&#xff0c;另一種是我們自己根據自己的ui來設計&#xff08;自定義&#xff09;。在一般開發中&#xff0c;我們主要使用的是自定義&#xff0c;主要是Aler…

Nacos 開源 MCP Router,加速 MCP 私有化部署

作者&#xff1a;正己 Nacos MCP Router 簡介 Nacos MCP Router 是一個基于 MCP 官方 SDK 開發的標準 MCP Server&#xff0c;為 MCP Client 提供 MCP Server 的智能搜索、安裝、代理等功能&#xff0c;極大地簡化了 MCP 服務的使用流程。同時&#xff0c;Nacos MCP Router 跟…

【趙渝強老師】Redis的主從復制集群

Redis的主從復制是指將一臺Redis服務器的數據&#xff0c;復制到其他的Redis服務器。前者稱為Master主節點&#xff0c;后者稱為Slave從節點。數據的復制是單向的&#xff0c;只能由主節點到從節點。在默認情況下每臺Redis服務器都是主節點。一個主節點可以有多個從節點或者沒有…

Git 子模塊只更新部分模塊的問題排查總結

Git 子模塊只更新部分模塊的問題排查總結 問題描述 在執行 git submodule update --init --recursive 命令時&#xff0c;雖然 .gitmodules 文件中定義了 3 個子模塊&#xff0c;但只有 handy-ollama 被更新&#xff0c;其他兩個子模塊沒有被處理。 > git submodule upda…

React 源碼7:Lane、React和schedule優先級轉換

在《源碼3》requestUpdateLane函數根據eventLane獲取不同情況對應優先級。一、優先級1.Lane的tag一共有32種lane。var TotalLanes 31; var NoLanes /* */ 0; var NoLane /* */ 0; var SyncLane /* …

Linux RDMA Maillist patchsets (Jul. 7 - Jul. 13, 2025)

1. Optimize DMABUF Mkey Page Size in mlx5 優化 mlx5 中的 DMABUF Mkey 頁大小 This patch series enables the mlx5 driver to dynamically select the optimal page size for DMABUF-based memory keys (mkeys), rather than relying on a fixed page size during registr…