代碼江湖:Python 中的進程與線程

大家好,我是闊升。今天,咱們來聊聊 Python 中的兩個"老熟人"——進程和線程。這兩個概念可以說是 Python 多任務編程中的"雙子星",既相似又不同,讓不少小伙伴們頭疼不已。不過別擔心,今天我們就來一起剖析一下它們的前世今生,看看怎么在實際編程中駕馭這兩個"小妖精"。

進程 vs 線程:一個江湖,兩種武功

進程:獨立的武林高手

想象一下,每個進程就像是一位獨立的武林高手,有自己的獨門武功(代碼)和內力(資源)。他們各自占山為王,互不干擾。在 Python 中,我們可以用 multiprocessing 模塊來創建和管理這些"高手"。

from multiprocessing import Processdef kung_fu_master(name):print(f"{name} 正在施展絕世武功!")if __name__ == "__main__":p1 = Process(target=kung_fu_master, args=("張三豐",))p2 = Process(target=kung_fu_master, args=("獨孤求敗",))p1.start()p2.start()p1.join()p2.join()

運行這段代碼,你會看到兩位武林高手同時大展神威。這就是多進程的魅力所在——它們能夠真正并行執行任務。

線程:同門師兄弟

相比之下,線程就像是同一個門派的師兄弟。他們共享功力(內存資源),但各自有自己的絕技(執行不同的代碼片段)。在 Python 中,我們用 threading 模塊來處理這些"師兄弟"。

import threadingdef shaolin_technique(technique):print(f"少林弟子正在使用 {technique}!")t1 = threading.Thread(target=shaolin_technique, args=("羅漢拳",))
t2 = threading.Thread(target=shaolin_technique, args=("金鐘罩",))t1.start()
t2.start()t1.join()
t2.join()

這段代碼展示了兩個少林弟子在同時施展不同的武功。線程之間切換迅速,看起來就像是并行執行,但實際上它們是在共享 CPU 時間。

何時使用進程,何時選擇線程?

選擇使用進程還是線程,就像在武俠世界中選擇獨行俠還是組建門派。這里有幾個考慮因素:

  1. 任務的獨立性:如果任務之間相互獨立,不需要頻繁共享數據,那么使用多進程可能更合適。

  2. 資源消耗:進程比線程更"重",創建和管理的開銷更大。如果你的應用需要創建大量的并發單元,線程可能是更好的選擇。

  3. 全局解釋器鎖(GIL):Python 的 GIL 限制了多線程在 CPU 密集型任務上的表現。對于此類任務,多進程可能更有優勢。

  4. 編程復雜度:多線程編程通常比多進程編程更容易上手,但也更容易出現難以調試的問題(比如死鎖)。

實戰案例:武林大會

讓我們來一個實際的例子,模擬一次武林大會,看看如何巧妙運用進程和線程:

import multiprocessing as mp  # 導入多進程模塊
import threading  # 導入多線程模塊
import time  # 導入時間模塊,用于模擬表演時間def martial_art_showcase(art):"""模擬單個武功的表演過程:param art: 武功名稱"""print(f"{art} 表演開始")time.sleep(2)  # 模擬表演時間,暫停 2 秒print(f"{art} 表演結束")def manage_performances(arts):"""管理一組武功的表演,每個武功使用一個線程:param arts: 武功列表"""threads = []for art in arts:# 為每個武功創建一個線程t = threading.Thread(target=martial_art_showcase, args=(art,))threads.append(t)t.start()  # 開始線程# 等待所有線程完成for t in threads:t.join()if __name__ == "__main__":# 定義武林大會的節目單,每個子列表代表一個比武場地的表演martial_arts = [["太極拳""形意拳""八卦掌"]["少林功夫""武當劍法""峨眉刺繡"]["蛇形刁手""醉拳""猴拳"]]processes = []for arts in martial_arts:# 為每個比武場地創建一個進程p = mp.Process(target=manage_performances, args=(arts,))processes.append(p)p.start()  # 啟動進程# 等待所有進程完成for p in processes:p.join()print("武林大會圓滿結束!")# 解釋:
# 1. 我們使用多進程來模擬多個比武場地同時進行表演。
# 2. 在每個進程(場地)內,我們使用多線程來模擬多個武功同時表演。
# 3. 這種結構允許我們充分利用多核處理器(多進程),同時在每個進程內高效地管理多個任務(多線程)。
# 4. 使用進程可以繞過 Python 的全局解釋器鎖(GIL),實現真正的并行。
# 5. 使用線程可以在單個進程內實現輕量級的并發,適合 I/O 密集型任務(如我們的模擬表演)。

在這個例子中,我們用進程來模擬不同的比武場地,每個場地內部用線程來管理不同武功的表演。這樣,我們就巧妙地結合了進程的并行能力和線程的輕量級特性。

通過這個實戰案例,我們可以看到:

  1. 進程用于實現真正的并行,適合 CPU 密集型任務或需要隔離的場景。
  2. 線程用于實現輕量級的并發,適合 I/O 密集型任務或共享內存的場景。
  3. 合理組合進程和線程可以充分利用系統資源,提高程序的整體性能。

這個武林大會的例子展示了如何在實際應用中靈活運用進程和線程,相信大家現在對這兩個概念有了更直觀的理解。

最后的話

進程和線程就像是 Python 多任務編程中的陰陽兩面。掌握它們的特性和使用方法,就像武林高手掌握了內外兼修的絕世武功。在實際開發中,要根據具體情況靈活選擇,有時候甚至可以兩者結合,才能發揮出最強大的威力。

記住,無論是進程還是線程,都是為了讓我們的程序更高效、更強大。所以,小伙伴們,練好這門功夫,讓你的 Python 代碼所向披靡,無人能擋!

闊升在這里祝大家編程愉快,功力日進。我們下期再見!

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

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

相關文章

element el-table實現表格動態增加/刪除/編輯表格行,帶校驗規則

本篇文章記錄el-table增加一行可編輯的數據列,進行增刪改。 1.增加空白行 直接在頁面mounted時對form里面的table列表增加一行數據,直接使用push() 方法增加一列數據這個時候也可以設置一些默認值。比如案例里面的 產品件數 。 mounted() {this.$nextTi…

latex 使用 thanks 首頁空白 問題

寫IEEE journal的時候遇到的問題……用latex寫了\thanks,編譯的論文第一頁是空的,這是因為\thanks要在\author內部,然后再用\maketitle,即\author{… \thanks{}}。這樣的話詳細信息就會出現在論文首頁的左下角 另外,\…

linux創建定時任務

crontab方式 先查看是否有cron systemctl status crond 沒有的話就安裝 yum install cronie 打開你的crontab文件進行編輯。使用以下命令打開當前用戶的crontab文件: crontab -e * * * * * /export/test.sh >> /export/test.log 2>&1/export/test.s…

差分算法中的F 和CR參數

自查使用。。F 類似梯度的大小 兩者都用于種群中新個體的生成

leetcode--從中序與后序遍歷序列構造二叉樹

leeocode地址:從中序與后序遍歷序列構造二叉樹 給定兩個整數數組 inorder 和 postorder ,其中 inorder 是二叉樹的中序遍歷, postorder 是同一棵樹的后序遍歷,請你構造并返回這顆 二叉樹 。 示例 1: 輸入:inorder …

Unity插件 Unitask學習日志

Unity插件 Unitask學習日志 下載地址 https://github.com/Cysharp/UniTask點擊這里可以查閱中文文檔 在Unity 2020,2021 中使用UPM下載會找不到,可以使用2022版本的unity可以在upm中找到。 安裝方式: 下載zip之后解壓, 復制Plugins 到Uni…

uniapp小程序使用webview 嵌套 vue 項目

uniapp小程序使用webview 嵌套 vue 項目 小程序中發送 <web-view :src"urlSrc" message"handleMessage"></web-view>export default {data() {return {urlSrc: "",};},onLoad(options) {// 我需要的參數比較多 所以比較臃腫// 獲取…

01. 數組篇(進行中......)

一. 前綴和技巧 &#xff08;1&#xff09;前綴和 前綴和技巧適用于快速、頻繁地計算一個索引區間內的元素之和。 class NumArray { public:vector<int> preSum; //前綴和數組NumArray(vector<int>& nums) {//preSum[0] 0&#xff0c;便于計算累加和preSum…

Qt圖形編輯類使用總結—正在編輯中

Qt的圖形編輯通常會涉及以下三個類:QGraphicsView類、QGraphicsScene類及QGraphicsItem類。 QGraphicsView 是構建復雜圖形用戶界面的強大工具,尤其適用于那些需要動態更新、可交互的2D圖形化應用程序,如圖表繪制、流程圖編輯器、游戲地圖顯示等等。通過結合使用 QGraphics…

Spring中的工廠模式詳解及應用示例

1. Spring中的BeanFactory BeanFactory是一個接口&#xff0c;表示它是一個工廠&#xff0c;負責生產和管理bean。在Spring中&#xff0c;BeanFactory是IOC容器的核心接口&#xff0c;定義了管理Bean的通用方法&#xff0c;如 getBean 和 containsBean。 BeanFactory與IOC容器…

Python編程:如何有效等待套接字的讀取與關閉

背景介紹 網絡編程是現代應用程序開發的重要組成部分&#xff0c;尤其是在大數據和實時通信的背景下。套接字&#xff08;Socket&#xff09;作為網絡通信的核心技術&#xff0c;是開發網絡應用程序的基礎。在Python編程中&#xff0c;如何有效地等待套接字的讀取與關閉事件是…

柔性測斜儀:監測鉆孔位移的核心利器

柔性測斜儀&#xff0c;作為一款創新的測量工具&#xff0c;憑借其卓越的設計與性能&#xff0c;在地下建筑、橋梁、隧道及水利水電工程等領域展現出非凡的應用價值。其安裝便捷、操作簡便、高精度及長壽命等特性&#xff0c;使之成為監測鉆孔垂直與水平位移的理想選擇。以下是…

算力共享,分布式大模型是什么,模型并行,流水線并行

目錄 算力共享,分布式大模型是什么 一、算力共享 二、分布式大模型 AllReduce是什么 原理概述 具體原理 簡單例子 模型并行,流水線并行是什么 模型并行 流水線并行 環形通信(如Ring AllReduce)、樹形通信(如Tree AllReduce 環形通信(Ring AllReduce) 樹形通…

【ComfyUI的API接口調用示例】

ComfyUI的API接口調用示例 本文目的 本文調用接口示例主要指導需要調用ComfyUI的開發者如何調用ComfyUI官方的API接口提交任務、查詢歷史、獲取繪畫視頻結果等。 閱讀本文的前提是你本地已經安裝了ComfyUI&#xff0c;并且對工作流繪畫和生成視頻已經有所了解。注意如圖右邊欄…

arm架構安裝chrome

在ARM架構設備上安裝谷歌軟件或應用通常涉及到幾個步驟&#xff0c;這取決于你要安裝的具體谷歌產品&#xff0c;比如谷歌瀏覽器、Google Play服務或者是其他谷歌開發的軟件。下面我會給出一些常見的指導步驟&#xff0c;以安裝谷歌瀏覽器為例&#xff1a; 在Linux ARM64上安裝…

常用的三角函數公式

sin ? 2 x cos ? 2 x 1 \sin ^2 x \cos ^2 x 1 sin2xcos2x1 tan ? x sin ? x cos ? x \tan x \dfrac{\sin x}{\cos x} tanxcosxsinx? cot ? x 1 tan ? x cos ? x sin ? x \cot x \dfrac{1}{\tan x}\dfrac{\cos x}{\sin x} cotxtanx1?sinxcosx? sec …

零基礎做項目---五子棋對戰---day02

用戶模塊 完成注冊登錄&#xff0c;以及用戶分數管理~使用數據庫來保存上述用戶信息. 使用 MyBatis來連接并操作數據庫了 主要步驟: 1.修改 Spring的配置文件,使數據庫可以被連接上. 2.創建實體類&#xff0c;用戶, User 3.創建Mapper接口~ 4.實現MyBatis 的相關xml配置…

MySQL安全值守常用語句

一、用戶權限設置 1、Mysql中用戶是如何定義的 用戶名主機域 10.0.0.5110.0.0.%%10.0.0.0/255.255.255.0Db01Localhost127.0.0.1 2、用戶創建 create user xinjing% identified by 123 3、用戶刪除 drop user username&#xff1b;username 是要刪除的用戶名:如 drop user root…

GDidees CMS v3.9.1 本地文件泄露漏洞(CVE-2023-27179)

前言 CVE-2023-27179 是一個影響 GDidees CMS v3.9.1 及更低版本的任意文件下載漏洞。這個漏洞存在于 /_admin/imgdownload.php 文件中&#xff0c;攻擊者可以通過向 filename 參數傳遞惡意輸入來下載服務器上的任意文件。 漏洞的根源在于對用戶輸入的 filename 參數處理不當…

【C++修行之道】string類練習題

目錄 387. 字符串中的第一個唯一字符 125. 驗證回文串 917. 僅僅反轉字母 415. 字符串相加&#xff08;重點&#xff09; 541. 反轉字符串 II 387. 字符串中的第一個唯一字符 字符串中的第一個唯一字符 - 力扣&#xff08;LeetCode&#xff09; 給定一個字符串 s &#…