使用Multiprocessing模塊創建子進程,需要放到__main__中

1 場景說明

在Python中,使用multiprocessing模塊創建子進程時,將創建子進程的代碼放在if __name__ == '__main__': 塊之外,如下面代碼:

import multiprocessing
import timedef test_func(name):print(f"子進程 {name} 開始運行")time.sleep(2)  # 模擬任務執行print(f"子進程 {name} 結束運行")# 創建子進程
p = multiprocessing.Process(target=test_func, args=("1",))
# 啟動子進程
p.start()
# 等待子進程結束
p.join()
print("主進程結束")

2 問題描述

代碼執行過后,報錯信息如下:

raise RuntimeError('''
RuntimeError: An attempt has been made to start a new process before thecurrent process has finished its bootstrapping phase.This probably means that you are not using fork to start yourchild processes and you have forgotten to use the proper idiomin the main module:if __name__ == '__main__':freeze_support()...The "freeze_support()" line can be omitted if the programis not going to be frozen to produce an executable.To fix this issue, refer to the "Safe importing of main module"section in https://docs.python.org/3/library/multiprocessing.html

3 原因分析

在 Python 中,使用 multiprocessing 模塊創建子進程時,必須將創建子進程的代碼放在if __name__ == '__main__':塊中。這是因為在 Windows 和 macOS 上,Python 使用spawn方式啟動子進程,這種方式會重新導入主模塊。如果不將代碼放在 if __name__ == '__main__': 塊中,會導致子進程重新執行主模塊的代碼,從而引發遞歸創建子進程的問題。

4 解決方案

將創建子進程的代碼塊放到if __name__ == '__main__':

import multiprocessing
import timedef test_func(name):print(f"子進程 {name} 開始運行")time.sleep(2)  # 模擬任務執行print(f"子進程 {name} 結束運行")if __name__ == '__main__':# 創建子進程p = multiprocessing.Process(target=test_func, args=("1",))# 啟動子進程p.start()# 等待子進程結束p.join()print("主進程結束")

5 Multiprocessing模塊中子進程啟動方式

5.2 啟動方式說明

在 Python 的 multiprocessing 模塊中,子進程的啟動方式主要有三種:spawnforkforkserver。不同的操作系統默認使用不同的啟動方式,而這些方式的行為和適用場景也有所不同。

5.3 默認啟動方式

Windows: 默認使用 spawn
macOS(Python 3.8+): 默認使用 spawn
Linux/Unix: 默認使用 fork

5.4 設置啟動方式

import multiprocessingdef worker():print("子進程運行")if __name__ == '__main__':# 設置啟動方式,可選spawn、fork、forkservermultiprocessing.set_start_method('spawn')# 如果設置成fork,則會拋異常ValueError: cannot find context for 'fork'# 創建子進程p = multiprocessing.Process(target=worker)p.start()p.join()

5.5 如何選擇啟動方式

Windows/macOS: 默認使用 spawn,無需更改。

Linux/Unix:
如果需要快速啟動且不涉及多線程,使用 fork。
如果需要避免資源沖突,使用 forkserver 或 spawn。

5.6 注意事項

5.6.1 多線程與 fork

在 Linux 上,如果父進程中有多線程,使用 fork 可能會導致死鎖或資源沖突。在這種情況下,建議使用spawnforkserver

5.6.2 跨平臺兼容性

如果代碼需要在多個平臺上運行,建議使用spawn,因為它是 Windows 和 macOS 的默認方式。

5.7 啟動方式比較

啟動方式spawnforkforkserver
描述重新啟動一個 Python 解釋器,只繼承主進程中運行進程所需的資源。不會繼承父進程的內存狀態。直接復制父進程的所有資源(包括內存狀態),創建子進程。先啟動一個服務器進程,之后每次創建子進程都從該服務器進程 fork。
支持操作系統Windows、macOSLinux、UnixLinux、Unix
優點安全性高,避免了父進程狀態不一致的問題。啟動速度快,因為直接復制父進程狀態。避免了直接 fork 父進程可能導致的問題。
比 spawn 更快,因為服務器進程已經初始化。
缺點啟動速度較慢,因為需要重新導入模塊和初始化環境。可能導致資源沖突(如文件描述符、鎖等)。
在 macOS 上,fork 可能會導致問題(尤其是涉及多線程時)。
需要額外的服務器進程。
適用場景Windows 和 macOS(默認方式)。
需要避免共享父進程狀態的場景。
Linux/Unix(默認方式)。
需要快速啟動子進程且不涉及多線程的場景。
Linux/Unix。
需要頻繁創建子進程且希望避免資源沖突的場景。

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

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

相關文章

描述<canvas>標簽的主要用途,如何在其上繪制簡單圖形?

大白話描述標簽的主要用途&#xff0c;如何在其上繪制簡單圖形&#xff1f; <canvas> 標簽的主要用途 <canvas> 標簽是 HTML5 中新增的一個標簽&#xff0c;它就像是一塊“畫布”&#xff0c;你可以在網頁上用它來繪制各種圖形、動畫、制作游戲等。簡單來說&…

【RHCE實驗】搭建主從DNS、WEB等服務器

目錄 需求 環境搭建 配置nfs服務器 配置web服務器 配置主從dns服務器 主dns服務器 從dns服務器 配置客戶端 客戶端測試 需求 客戶端通過訪問 www.nihao.com 后&#xff0c;能夠通過 dns 域名解析&#xff0c;訪問到 nginx 服務中由 nfs 共享的首頁文件&#xff0c;內容…

Shell條件判斷

一、使用if選擇結構 if單分支的語法組成&#xff1a; if 條件測試;then 命令序列 fi if雙分支的語法組成&#xff1a; if 條件測試;then 命令序列1 else 命令序列2 fi if多分支的語法組成&#xff1a; if 條…

理解langchain langgraph 官方文檔示例代碼中的MemorySaver

以下是langchain v0.3官方示例代碼 from langgraph.checkpoint.memory import MemorySaver from langgraph.graph import START, MessagesState, StateGraph# 可以理解為&#xff1a;定義一個流程&#xff0c;這個流程中用到的數據類型是Messages。 <---定義一個有向圖&…

【HarmonyOS Next之旅】DevEco Studio使用指南(三)

目錄 1 -> 一體化工程遷移 1.1 -> 自動遷移 1.2 -> 手動遷移 1.2.1 -> API 10及以上歷史工程遷移 1.2.2 -> API 9歷史工程遷移 1 -> 一體化工程遷移 DevEco Studio從 NEXT Developer Beta1版本開始&#xff0c;提供開箱即用的開發體驗&#xff0c;將SD…

vuex持久化存儲,手動保存到localStorage

vuex持久化存儲&#xff0c;手動保存到localStorage 一、vue21. 手動存儲到localStoragestore/index.js 2. 使用持久化存儲插件store/index.jsstore/modules/otherData.js保存到localStorage 二、vue31. index.ts2. store/modules/globalData.ts3. 在組件中使用App.vue 一、vue…

nodejs使用 mysql2 模塊獲取 mysql 中的 json字段,而不是 mysql

mysql 模塊獲取的 json 字段&#xff0c;是字符串mysql2 模塊獲取的 json 字段&#xff0c;是符合預期的 json 對象 mysql mysql2 最后編輯于&#xff1a;2025-02-24 22:16:53 © 著作權歸作者所有,轉載或內容合作請聯系作者 喜歡的朋友記得點贊、收藏、關注哦&#xff01;…

鴻蒙(OpenHarmony)開發實現 息屏/亮屏 詳情

官網參考鏈接 實現點擊關閉屏幕&#xff0c;定時5秒后喚醒屏幕 權限 {"name": "ohos.permission.POWER_OPTIMIZATION"}代碼實現 import power from ohos.power;Entry Component struct Page3 {private timeoutID: number | null null; // 初始化 timeout…

【網工第6版】第1章 計算機網絡概論

目錄 1計算機網絡形成和發展 ■計算機網絡 ■我國互聯網發展 ■計算機網路分類 ■計算機網絡應用 2 OSI和TCP/IP參考模型 ■網絡分層的意義 ■OSI參考模型 ■TCP/IP參考模型 ■TCP/IP參考模型協議 3 數據封裝與解封過程 ■封裝 ■解封 1計算機網絡形成和發展 ■計…

理解我們單片機擁有的資源

目錄 為什么要查詢單片機擁有的資源 所以&#xff0c;去哪些地方可以找數據手冊 一個例子&#xff1a;STM32F103C8T6 前言 本文章隸屬于項目&#xff1a; Charliechen114514/BetterATK: This is a repo that helps rewrite STM32 Common Repositorieshttps://github.com/C…

《我的Python覺醒之路》之轉型Python(十五)——控制流

[今天是2025年3月17日&#xff0c;繼續復習第一章節、第二章節的內容 ] 《我的Python覺醒之路》之轉型Python&#xff08;十四&#xff09;——控制流

AndroidStudio+Android8.0下的Launcher3 導入,編譯,燒錄,調試

文章目錄 編譯完成搜索輸出文件Android.mk配置gradle編譯環境報錯一報錯二報錯三輸出文件下載INSTALL_FAILED_TEST_ONLY查找系統簽名查找簽名工具開始簽名查看簽名簽名問題重新生成秘鑰解決方案生成成功挽救錯誤:重新刷機更換testkey秘鑰keystore生成keystoreINSTALL_FAILED_S…

Linux--gdb/cgdb

ok&#xff0c;我們今天學習gdb的安裝和使用 調試器-gdb/cgdb使用 VS、VScode編寫的代碼一般都是release格式的&#xff0c;gdb 的格式一般是debug 換成debug模式命令 :-g gdb會記錄最新的一條命令&#xff0c;直接回車就是默認執行該命令 一個調試周期下&#xff0c;斷點…

Oracle GoldenGate 全面解析

Oracle GoldenGate 全面解析 Oracle GoldenGate 是一種實時數據集成和復制解決方案,廣泛應用于數據同步、數據庫遷移、高可用性和災難恢復等場景。以下將詳細解答您提出的關于 Oracle GoldenGate 的一系列問題。 1. Oracle GoldenGate 的架構組成及其核心組件的作用 架構組成…

ModBus TCP/RTU互轉(主)(從)|| Modbus主動輪詢下發的工業應用 || 基于智能網關的串口服務器進行Modbus數據收發的工業應用

目錄 前言 一、ModBus TCP/RTU互轉&#xff08;從&#xff09;及應用|| 1.1 舉栗子 二、ModBus TCP/RTU互轉&#xff08;主&#xff09; 2.1 舉栗子 三、ModBus 主動輪詢 3.1 Modbus主動輪詢原理 3.2 Modbus格式上傳與下發 3.2.1.設置Modbus主動輪詢指令 3.2.2 設…

場景題:一個存儲IP地址的100G 的文件, 找出現次數最多的 IP ?

和大文件中存id&#xff0c;然后要求排序問題一樣的處理思路 使用MapReduce的思想解決&#xff0c;加上哈希分割&#xff0c;先將大文件中的IP地址按照哈希函數進行分割&#xff0c;存到多個文件上&#xff0c;接著每個分片單獨處理&#xff0c;用Hashmap統計IP出現頻次&#…

【操作系統安全】任務2:用戶與用戶組

目錄 一、用戶與用戶組介紹 1.1 用戶 1.2 用戶組 1.3 用戶與用戶組的關系 二、用戶與用戶組管理 2.1 用戶管理 2.1.1 創建用戶 2.1.2 設置用戶密碼 2.1.3 刪除用戶 2.2 用戶組管理 2.2.1 創建用戶組 2.2.2 刪除用戶組 2.2.3 將用戶添加到用戶組 三、影子賬戶創建…

OpenCV計算攝影學(20)非真實感渲染之增強圖像的細節函數detailEnhance()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 此濾波器增強特定圖像的細節。 cv::detailEnhance用于增強圖像的細節&#xff0c;通過結合空間域和頻率域的處理&#xff0c;提升圖像中特定細節…

Git 使用指南

Git 是一種分布式版本控制系統&#xff0c;可以追蹤文件的變化并協助多人協作開發項目。下面是 Git 的基本概念和使用方式&#xff1a; 倉庫&#xff08;Repository&#xff09;&#xff1a;Git 用來存儲項目的地方&#xff0c;可以理解為項目的文件夾&#xff0c;包含項目的所…

java 中散列表(Hash Table)和散列集(Hash Set)是基于哈希算法實現的兩種不同的數據結構

在 Java 中&#xff0c;散列表&#xff08;Hash Table&#xff09;和散列集&#xff08;Hash Set&#xff09;是兩種不同的數據結構&#xff0c;但它們都基于哈希表的原理來實現。下面是它們的聯系與區別、實現類以及各自的優缺點&#xff0c;并用表格進行對比整理。 聯系與區…