Python 多任務編程:進程、線程與協程全面解析

目錄

一、多任務基礎:并發與并行

1. 什么是多任務

2. 兩種表現形式

二、進程:操作系統資源分配的最小單位

1. 進程的概念

2. 多進程實現多任務

2.1 基礎示例:邊聽音樂邊敲代碼

2.2 帶參數的進程任務

2.3 進程編號與應用注意點

2.3.1 進程編號的作用

2.3.2 關鍵注意點

三、線程:程序執行的最小單位

1. 線程的概念

2. 多線程實現多任務

3. 線程的核心特性

四、進程與線程的對比

五、協程:用戶態的輕量級線程

1. 協程的概念

2. 核心優勢

3. 基于asyncio實現協程

4. 協程的適用場景與注意事項

六、總結:如何選擇多任務方案


在日常開發中,我們經常會遇到需要同時處理多個任務的場景,比如網盤同時下載多個文件、程序一邊播放音樂一邊執行計算。這些都離不開多任務編程技術。本文將基于 Python,從多任務的基礎概念出發,詳細講解進程、線程與協程三種實現方式,幫助你輕松掌握多任務編程的核心邏輯。

一、多任務基礎:并發與并行

1. 什么是多任務

多任務指在同一時間內執行多個任務,比如電腦同時運行微信、瀏覽器和代碼編輯器。其核心價值是充分利用 CPU 資源,提升程序執行效率

2. 兩種表現形式

多任務的實現分為 “并發” 和 “并行”,二者的核心區別在于是否 “真正同時執行”:

(1)并發:單核 CPU 場景下,操作系統輪流讓多個任務交替執行(如任務 1 執行 0.01 秒→切換到任務 2 執行 0.01 秒)。由于 CPU 速度極快,表面上看起來任務在同時運行。適用場景:任務數量>CPU 核心數

(2)并行:多核 CPU 場景下,每個核心分別執行一個任務,多個任務真正同時進行。適用場景:任務數量≤CPU 核心數

二、進程:操作系統資源分配的最小單位

1. 進程的概念

進程(Process)是操作系統進行資源分配和調度的基本單位,一個正在運行的程序就是一個進程(如打開的微信、Chrome 瀏覽器)。一個程序運行后至少會創建一個主進程

2. 多進程實現多任務

通過 Python 的multiprocessing模塊,我們可以創建子進程,讓多個任務并行執行。

核心步驟

(1)導入multiprocessing模塊;
(2)用multiprocessing.Process()創建進程對象,指定目標任務(函數名);
(3)調用start()方法啟動進程。

2.1 基礎示例:邊聽音樂邊敲代碼

import multiprocessing
import time# 任務1:聽音樂
def music():for i in range(3):print("聽音樂...")time.sleep(0.2)# 任務2:敲代碼
def coding():for i in range(3):print("敲代碼...")time.sleep(0.2)if __name__ == '__main__':# 創建進程對象music_process = multiprocessing.Process(target=music)coding_process = multiprocessing.Process(target=coding)# 啟動進程music_process.start()coding_process.start()

2.2 帶參數的進程任務

通過args(元組)或kwargs(字典)給任務傳遞參數:

if __name__ == '__main__':# 元組傳參(注意逗號)music_process = multiprocessing.Process(target=music, args=(3,))# 字典傳參coding_process = multiprocessing.Process(target=coding, kwargs={'count': 3})music_process.start()coding_process.start()

2.3 進程編號與應用注意點

2.3.1 進程編號的作用

每個進程都有唯一編號(PID),用于區分主進程和子進程,方便進程管理。通過os模塊獲取:

(1)os.getpid():獲取當前進程編號;

(2)os.getppid():獲取父進程編號(創建當前進程的進程)

2.3.2 關鍵注意點

(1)進程間不共享全局變量:子進程會拷貝主進程的資源,修改子進程的全局變量不會影響主進程;

(2)主進程與子進程的結束順序:默認主進程會等待所有子進程執行完再結束。若需主進程結束時子進程也終止,可:

  • 設置守護進程:process.daemon = True;
  • 手動終止子進程:process.terminate()。

三、線程:程序執行的最小單位

1. 線程的概念

線程(Thread)是進程內的執行單元,共享進程的所有資源(如內存、文件句柄)。一個進程默認有一個主線程,可創建多個子線程,就像 “一個 QQ 打開兩個聊天窗口”,既實現多任務又節省資源。

2. 多線程實現多任務

通過threading模塊實現,步驟與多進程類似,且資源開銷更低、啟動速度更快。

基礎示例

import threading
import timedef music():for i in range(3):print("聽音樂...")time.sleep(0.2)def coding():for i in range(3):print("敲代碼...")time.sleep(0.2)if __name__ == '__main__':# 創建線程對象music_thread = threading.Thread(target=music)coding_thread = threading.Thread(target=coding)# 啟動線程music_thread.start()coding_thread.start()

3. 線程的核心特性

  • 共享全局變量:同一進程內的線程共享全局變量(如列表、字典),但需注意 “線程安全”(需用鎖避免數據競爭);
  • 執行順序無序:線程的執行由 CPU 調度決定,無法保證順序;
  • 守護線程:設置thread.daemon = True,主線程結束時子線程自動終止。

四、進程與線程的對比

特性進程(Process)線程(Thread)
定義資源分配最小單位程序執行最小單位
資源開銷高(獨立內存、資源)低(共享進程資源)
啟動速度
全局變量共享不共享(需 IPC 通信)共享(需鎖保證安全)
適用場景CPU 密集型任務(如計算、數據分析)I/O 密集型任務(如網絡請求、文件讀寫)
模塊multiprocessingthreading

五、協程:用戶態的輕量級線程

1. 協程的概念

協程(Coroutine)是用戶態的輕量級線程,通過 “協作式調度” 實現并發 —— 無需操作系統介入,僅需保存寄存器上下文,切換效率極高。

2. 核心優勢

  • 無鎖機制:避免多線程的同步開銷;
  • 高并發:單線程內可處理數千個 I/O 密集型任務;
  • 代碼簡潔:用async/await語法,以同步風格寫異步邏輯。

3. 基于asyncio實現協程

asyncio是 Python 官方協程庫,核心是 “事件循環”(管理協程的執行)。

基礎示例

import asyncio# 定義協程函數(用async修飾)
async def my_coroutine():print("Start")# 非阻塞等待(替代time.sleep,不阻塞事件循環)await asyncio.sleep(1)print("End")# 啟動事件循環
asyncio.run(my_coroutine())

并發執行多個協程

用asyncio.create_task()創建任務,asyncio.gather()并發執行:

async def task(name, delay):await asyncio.sleep(delay)print(f"{name} completed")async def main():# 創建任務列表tasks = [asyncio.create_task(task("A", 2)),asyncio.create_task(task("B", 1))]# 并發執行await asyncio.gather(*tasks)asyncio.run(main())
# 輸出:B completed → A completed(按完成時間排序)

4. 協程的適用場景與注意事項

  • 適用場景:I/O 密集型任務(如網絡爬蟲、API 調用),結合aiohttp(異步 HTTP 庫)可大幅提升效率;
  • 注意事項

(1)協程內禁用time.sleep()等同步操作,需用asyncio.sleep();

(2)需 Python 3.7+,推薦用asyncio.run()管理事件循環。

(3)不適合 CPU 密集型任務(需結合多進程);

六、總結:如何選擇多任務方案

  1. CPU 密集型任務(如計算、矩陣運算):用多進程(繞過 Python GIL 鎖,利用多核 CPU);
  2. I/O 密集型任務(如網絡請求、文件讀寫):優先用協程(效率最高、資源開銷最低),其次用多線程;
  3. 簡單多任務場景:若無需多核利用,用多線程(實現簡單、通信方便)。

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

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

相關文章

ADSL技術

<摘要> ADSL&#xff08;非對稱數字用戶線路&#xff09;是一種利用傳統電話線實現寬帶上網的技術。其核心原理是頻率分割&#xff1a;將一根電話線的頻帶劃分為語音、上行數據&#xff08;慢&#xff09;和下行數據&#xff08;快&#xff09;三個獨立頻道&#xff0c;從…

信號衰減中的分貝到底是怎么回事

問題&#xff1a;在一個低通濾波中&#xff0c;經常會看到一個值-3dB&#xff08;-3分貝&#xff09;&#xff0c;到底是個什么含義&#xff1f; 今天我就來粗淺的講解這個問題。 在低通濾波器中&#xff0c;我們說的 “截止頻率”&#xff08;或叫 - 3dB 點&#xff09;&…

工具分享--IP與域名提取工具2.0

基于原版的基礎上新增了一個功能點:IP-A段過濾&#xff0c;可以快速把內網192、170、10或者其它你想要過濾掉的IP-A段輕松去掉&#xff0c;提高你的干活效率&#xff01;&#xff01;&#xff01; 界面樣式預覽&#xff1a;<!DOCTYPE html> <html lang"zh-CN&quo…

如何通過日志先行原則保障數據持久化:Redis AOF 和 MySQL redo log 的對比

在分布式系統或數據庫管理系統中&#xff0c;日志先行原則&#xff08;Write-Ahead Logging&#xff0c;WAL&#xff09; 是確保數據一致性、持久性和恢復能力的重要機制。通過 WAL&#xff0c;系統能夠在發生故障時恢復數據&#xff0c;保證數據的可靠性。在這篇博客中&#x…

臨床研究三千問——臨床研究體系的3個維度(8)

在上周的文章中&#xff0c;我們共同探討了1345-10戰策的“臨床研究的起點——如何提出一個犀利的臨床與科學問題”。問題固然是靈魂&#xff0c;但若沒有堅實的骨架與血肉&#xff0c;靈魂便無所依歸。今天&#xff0c;我們將深入“1345-10戰策”中的“3”&#xff0c;即支撐起…

AI+預測3D新模型百十個定位預測+膽碼預測+去和尾2025年9月7日第172彈

從今天開始&#xff0c;咱們還是暫時基于舊的模型進行預測&#xff0c;好了&#xff0c;廢話不多說&#xff0c;按照老辦法&#xff0c;重點8-9碼定位&#xff0c;配合三膽下1或下2&#xff0c;殺1-2個和尾&#xff0c;再殺4-5個和值&#xff0c;可以做到100-300注左右。(1)定位…

萬字詳解網絡編程之socket

一&#xff0c;socket簡介1.什么是socketsocket通常也稱作"套接字"&#xff0c;?于描述IP地址和端?&#xff0c;是?個通信鏈的句柄&#xff0c;應用程序通常通過"套接字"向?絡發出請求或者應答?絡請求。?絡通信就是兩個進程間的通信&#xff0c;這兩…

維度躍遷:當萬物皆成電路,智能將從“擁有”變為“存在”

我們習以為常的電子世界&#xff0c;其本質是一個由電路構成的精密宇宙。而一場從二維到三維的終極變革&#xff0c;正在悄然醞釀&#xff0c;它將徹底顛覆我們創造和交互的方式。一、電子世界的本質&#xff1a;一切都是電路 在深入未來之前&#xff0c;我們首先要理解當下。電…

大語言模型預訓練數據采集與清洗技術實踐:從語料到知識庫的全流程優化

大語言模型(LLM)的性能上限由 “數據質量 數據規模 數據多樣性” 共同決定 —— 預訓練階段的海量語料決定模型的泛化能力與語言理解基礎,而知識庫數據則決定模型的知識準確性與領域專業性。當前 LLM 落地面臨的核心痛點之一,便是 “數據臟、處理難、知識雜”:預訓練語料…

模擬音頻采集設備的制作

模擬音頻程序與設備的制作 需要設備 esp32s3 pcm1808 pcm5102(非必須) 程序界面 程序代碼 代碼鏈接

Java Modbus通信實戰(四):Modbus通信測試與故障排查

在工業現場&#xff0c;設備通信系統就像工廠的神經網絡&#xff0c;連接著各種傳感器、控制器和執行器。當你搭建好這套系統后&#xff0c;最關鍵的一步就是全面測試&#xff0c;確保每個環節都能正常工作。 就像汽車出廠前要經過嚴格的路試一樣&#xff0c;Modbus RTU通信系統…

少兒編程C++快速教程之——1. 基礎語法和輸入輸出

1. 歡迎來到C編程世界&#xff01; 1.1 什么是編程&#xff1f; 編程就像是給計算機寫一份詳細的"說明書"&#xff0c;告訴它該做什么、怎么做。C是一種強大的編程語言&#xff0c;可以用來創建游戲、應用程序和各種有趣的軟件&#xff01; 1.2 第一個C程序&#xff…

arma::imat22

arma::imat22 是 Armadillo C 線性代數庫中定義的一個固定大小的 2x2 有符號整數矩陣類型。它主要用于處理小型、維度在編譯時已知的整數矩陣&#xff0c;因其在棧上分配內存&#xff0c;故通常比動態矩陣有更高的效率。 下面是一個匯總了 arma::imat22 主要特性的表格&#xf…

狗都能看懂的HunYuan3D 1.0詳解

HunYuan3D 1.0 HunYuan3D 1.0是2024年9月發布的一篇論文。雖然站在現在的時間節點&#xff0c;HunYuan3D系列已經出到2.5了&#xff0c;但是1.0版本的改進思路&#xff0c;和它trick集成的做法&#xff0c;還是很值得學習的。由于文章用到了很多技術&#xff0c;由于篇幅有限&a…

踏腳邁入奇幻樂園

每天早上上班的路上都會經過一個小花園。它被夾在丁字路口的拐角&#xff0c;面積不大&#xff0c;匆匆而過的行人都不會注意到它。但如果順著幾個不起眼的入口走進去&#xff0c;里面卻是別有洞天。清早的街道還沒有車水馬龍的喧嘩&#xff0c;花園里靜悄悄的。各式各樣的花草…

內存越界引發線程函數調用堆棧回溯異常以及INT 3軟中斷實戰分析案例分享

目錄 1、問題說明 2、導出dump文件時只是遇到了INT 3軟中斷&#xff0c;并沒有發生異常崩潰 3、函數中發生了棧內存越界&#xff0c;導致線程的棧回溯出異常&#xff0c;堆棧中只顯示一行函數調用記錄 3.1、處理Json數據時產生了異常 3.2、函數中發生棧內存越界&#xff0…

LeetCode 240: 搜索二維矩陣 II - 算法詳解(秒懂系列

文章目錄LeetCode 240: 搜索二維矩陣 II - 算法詳解題目描述Java解決方案算法思路核心理念為什么選擇右上角&#xff1f;可視化演示過程示例1&#xff1a;查找 target 5示例2&#xff1a;查找 target 20 (不存在)算法分析時間復雜度空間復雜度算法優勢關鍵要點擴展思考LeetCo…

洛谷 B4071 [GESP202412 五級] 武器強化

思考難度低&#xff0c;但是代碼難度相對較高的題&#xff0c;故做個記錄。首先&#xff0c;題目說了要花費最少的錢&#xff0c;所以我們每次拿最便宜的材料給武器1思想&#xff1a;每次都拿最便宜的材料然后考慮一下這個思想是否正確&#xff0c;找一下反例&#xff0c;每次拿…

SQL工具30年演進史:從Oracle到Navicat、DBeaver,再到Web原生SQLynx

目錄 一、1990s&#xff1a;廠商自帶的數據庫工具時代 二、2000s&#xff1a;Navicat等商業數據庫管理工具崛起 三、2010s&#xff1a;DBeaver等開源SQL工具興起 四、2020s&#xff1a;SQLynx&#xff0c;Web原生數據庫管理工具 五、SQL工具30年時間線對比 六、總結&…

C語言制作掃雷游戲(拓展版賦源碼)

目錄 引言&#xff1a; 三個新功能實現 1.可以選擇難度或自定義 實現難點解析 代碼實現&#xff08;附源碼&#xff09; 掃雷.c game.h game.c 2.對選擇位置進行標記或取消標記 一.框架 我們先理一下思路 如何構造框架 二.取消標記函數 三.標記函數 四.加入清屏&#xff0c;進…