32. 線程、進程與協程

一、什么是多任務

??如果一個操作系統上同時運行了多個程序,那么稱這個操作系統就是 多任務的操作系統,例如:Windows、Mac、Android、IOS、Harmony 等。如果是一個程序,它可以同時執行多個事情,那么就稱為 多任務的程序

??一個 CPU 默認可以執行一個程序,如果想要多個程序一起執行,理論上就需要多個 CPU 來執行。

??如果一個 CPU 是一個核心,理論上只能同時運行一個任務,但是事實上卻可以運行很多個任務。這是因為操作系統控制著 CPU,讓 CPU 做了一個特殊的事情,一會運行一個任務,然后快速的運行另一個任務,依次類推,實現了多個任務,看上去 “同時” 運行多個任務。

并發:是一個對假的多任務的描述;

并行:是真的多任務的描述;

二、進程與線程

??計算機程序只是存儲在磁盤上的可執行二進制(或其它類型)文件。只有把它們加載到內存中從被操作系統調用,才擁有其生命期。

??進程(process)則是一個執行中的程序。每個進程都擁有自己的地址空間、內存、數據棧以及其它用于跟蹤執行的輔助數據。操作系統管理其上所有進程的執行,并為這些進程合理分配時間。進程也可以通過派生新的進程來執行其它任務,不過因為每個新進程也都擁有自己的內存和數據棧等,所以只能采用進程間通信的方式共享數據;

??線程(thread)與進程類似,不過它們是同一個進程下執行的,并共享相同的下上文。線程包括開始、執行順序和結束三部分。它有一個指令指針,用于記錄當前運行的上下文。當其它線程運行時,它可以被搶占(中斷)和臨時掛起(也稱為睡眠)—— 這種做法叫做讓步(yielding)。

??一個進程中的各個線程與主線程共享同一片數據空間。線程一般是以并發方式執行的。在單核 CPU 系統中,因為真正的并發是不可能的,所以線程的執行實際上是這樣規劃的:每個線程運行一小會,然后讓步給其它線程(再次排隊等待更多的 CPU 時間)。在整個進程的執行過程中,每個線程執行它自己特定的任務,在必要時和其它線程進行結果通信。

??但是這種共享數據也是存在風險的。如果兩個或多個線程訪問同一片數據,由于數據訪問順序不同,可能導致結果不一致。這種情況通常稱為 “競態條件”(race condition)。另一個需要注意的問題時,線程無法給予公平的執行時間。這是因為一些函數會在完成前保持阻塞狀態,如果沒有專門為多線程情況進行修改,會導致 CPU 的時間分配向這些貪婪的函數傾斜。

??在實現多任務時,線程切換從系統層面遠不止保存和恢復 CPU 上下文這么簡單。操作系統為了程序運行的高效性,每個線程都有自己緩存 Cache 等數據。操作系統還會幫你做這些數據的恢復操作。所以線程的切換比較耗性能。但是協程的切換只是單純的操作 CPU 的上下文。

線程是計算機中可以被 CPU 調度的最小單元,進程是計算機資源分配的最小單元;進程作為資源分配的單位,系統在運行時會為每個進程分配不同的內存區域;

一個程序,至少有一個進程,一個進程中至少有一個線程,最終是線程在工作;

一個進程內可以開設多個線程,在用一個進程內開設多個線程無需再次申請空間及拷貝代碼的操作,開設線程的開銷遠遠的要小于進程的開銷;

單核 CPU,其實是一種假的多線程,因為在一個時間單元內,也只能執行一個線程的任務。但是因為 CPU 時間單元特別短,因此感覺不出來;

三、多進程的使用場景

??多進程 適合 計算密集型 的場景。

【1】、多進程的使用

import os, timefrom multiprocessing import Processdef task():val = 1for i in range(1, 100000):val *= iif __name__ == "__main__":l = []count = int(os.cpu_count())print(f"當前計算機CPU核心個數:{count}")start_time = time.time()for i in range(count):p = Process(target=task)p.start()l.append(p)for p in l:p.join()print(f"運行時間:{time.time() - start_time}")

【2】、多線程的使用

import os, timefrom threading import Threaddef task():val = 1for i in range(1, 100000):val *= iif __name__ == "__main__":l = []count = int(os.cpu_count())print(f"當前計算機CPU核心個數:{count}")start_time = time.time()for i in range(count):t = Thread(target=task)t.start()l.append(t)for t in l:t.join()print(f"運行時間:{time.time() - start_time}")

四、多線程的使用場景

??多線程 適合 IO 密集型 場景

【1】、多進程的使用

import timefrom multiprocessing import Processdef task():time.sleep(3)if __name__ == "__main__":l = []start_time = time.time()for i in range(1000):p = Process(target=task)p.start()l.append(p)for p in l:p.join()print(f"運行時間:{time.time() - start_time}")

【2】、多線程的使用

import timefrom threading import Threaddef task():time.sleep(3)if __name__ == "__main__":l = []start_time = time.time()for i in range(1000):t = Thread(target=task)t.start()l.append(t)for t in l:t.join()print(f"運行時間:{time.time() - start_time}")

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

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

相關文章

概率論 期末 筆記

第一章 隨機事件及其概率 利用“四大公式”求事件概率 習題 推導 全概率公式與貝葉斯公式 伯努利概型求概率 一維隨機變量及其分布

VLAN數據格式

概念:VLAN叫做虛擬局域網,指在物理網絡中根據用于、工作組、應用等進行邏輯劃分的局域網,是一個廣播域,與用戶的物理位置沒有關系。 作用:VLAN可以靈活的進行分段和組織,能夠實現更好的安全性,…

css 裁剪 clip-path

clip-path 是一個強大的 CSS 屬性,用于裁剪元素的可視區域,支持多種形狀裁剪。它可以用來創建復雜的裁剪效果,如圓形、多邊形、路徑等。 clip-path: none | shape | url(#clipPathId);none:不裁剪,顯示完整內容。shap…

*【每日一題 基礎題】 [藍橋杯 2023 省 B] 飛機降落

題目描述 N 架飛機準備降落到某個只有一條跑道的機場。其中第 i 架飛機在 Ti 時刻到達機場上空,到達時它的剩余油料還可以繼續盤旋 Di 個單位時間,即它最早可以于 Ti 時刻開始降落,最晚可以于 Ti Di 時刻開始降落。降落過程需要 Li個單位時間…

計算機vcruntime140_1.dll丟失是什么原因?vcruntime140_1.dll丟失的解決辦法如下:

計算機中vcruntime140_1.dll文件丟失的原因可能有多種,以下是一些常見的原因: 安裝不完整或損壞:某些應用程序在安裝過程中可能因為意外中斷、安裝程序損壞或其他原因導致vcruntime140_1.dll未能正確安裝或復制到系統目錄。軟件卸載或更新不…

Redis學習(三)緩存

Redis學習(三)緩存 一、什么是緩存?如何使用緩存 二、添加商戶緩存1、緩存模型和思路2、緩存更新策略1、數據庫緩存不一致解決方案:2、數據庫和緩存不一致采用什么方案 3、實現商鋪和緩存與數據庫雙寫一致 三、緩存穿透問題的解決思路1、編碼…

軟件設計與體系結構

1.簡要說明什么是軟件體系結構,軟件體系結構模型,為什么要建立軟件體系結構模型? 答:軟件體系結構指一個軟件系統在高層次上的結構化組織方式,包括系統的組成部分和各個部分之間的關系,以及它們與環境之間的…

Essential Use Cases和Real Use Cases

在軟件開發領域,用例(Use Cases)是一種非常重要的工具,它能夠幫助開發團隊、產品經理以及用戶之間對系統的功能需求達成一致。用例描述了在特定條件下,系統對用戶請求所做出的響應,從而清晰地表達了系統的行…

P102如何降頻降壓

要對NVIDIA P102顯卡進行降頻降壓操作,可以按照以下步驟進行: ? 使用MSI Afterburner軟件: ? 打開MSI Afterburner,使用曲線編輯器調整頻率和電壓。豎軸為核心頻率,橫軸為電壓。通過整體下移靠后的頻率和電壓區域&a…

概率論得學習和整理32: 用EXCEL描述正態分布,用δ求累計概率,以及已知概率求X的區間

目錄 1 正態分布相關 2 正態分布的函數和曲線 2.1 正態分布的函數值,用norm.dist() 函數求 2.2 正態分布的pdf 和 cdf 2.3 正態分布的圖形隨著u 和 δ^2的變化 3 正態分布最重要的3δ原則 3.0 注意,這里說的概率一定是累計概率CDF,而…

HTML5文檔元數據詳解

HTML5文檔元數據詳解 在HTML5中&#xff0c;元數據&#xff08;Meta Data&#xff09;是文檔頭部的重要組成部分&#xff0c;提供了關于網頁本身的信息。以下是一些常見的元數據標簽及其詳細說明。 1. <meta> 標簽 <meta>標簽用于定義文檔的元數據&#xff0c;通…

使用開源在線聊天工具Fiora輕松搭建個性化聊天平臺在線交流

文章目錄 前言1.關于Fiora2.安裝Docker3.本地部署Fiora4.使用Fiora5.cpolar內網穿透工具安裝6.創建遠程連接公網地址7.固定Uptime Kuma公網地址 前言 今天給大家介紹一款免費開源的在線聊天工具——Fiora。它不僅是一款功能強大的即時通訊軟件&#xff0c;更是開發者們展現創造…

pm面試題

你平時都用哪些產品&#xff0c;這些產品好在哪里&#xff0c;不好在哪里&#xff0c;為什么&#xff1f;&#xff08;問到概率50%&#xff09; 把市面上的常見產品進行一個調研來設計一個跨境電商產品&#xff0c;請說明你需要多少費用和什么樣的團隊&#xff0c;將在一年內將…

VS Code Copilot 與 Cursor 對比

選手簡介 VS Code Copilot&#xff1a;算是“老牌”編程助手了&#xff0c;雖然Copilot在別的編輯器上也有擴展&#xff0c;不過體驗最好的還是VS Code&#xff0c;畢竟都是微軟家的所以功能集成更好一些&#xff1b;主要提供的是Complete和Chat能力&#xff0c;也就是代碼補全…

Java Spring Boot 項目中嵌入前端靜態資源:完整教程與實戰案例

言簡意賅的講解Java Spring Boot 中嵌入前端項目的靜態資源解決的痛點 之前給大家講解了如何部署一個前端項目&#xff0c;但大家還是好奇如何部署一個前后端一體項目。將前端構建后的靜態資源嵌入 Java Spring Boot 后端項目&#xff0c;是現代全棧開發中一種流行的實踐方式。…

R200推理

一、環境搭建 1.下載鏡像 wget https://bj.bcebos.com/klx- public/kdk/project/anyinfer_x86_output/20240316/anyinfer_x86_v5.tar.gz wget https://bj.bcebos.com/klxpublic/kdk/project/anyinfer_x86_output/20240316/anyinfer_x86_v5.tar.gz tar -zxvf a…

RabbitMQ中的Topic模式

在現代分布式系統中&#xff0c;消息隊列&#xff08;Message Queue&#xff09;是實現異步通信、解耦系統組件的重要工具。RabbitMQ 是一個廣泛使用的開源消息代理&#xff0c;支持多種消息傳遞模式&#xff0c;其中 Topic 模式 是一種靈活且強大的模式&#xff0c;允許生產者…

可編輯99PPT | 智能工廠整體規劃方案及實施細部方案

薦言分享&#xff1a;智能工廠是利用物聯網、大數據、人工智能等先進技術&#xff0c;實現生產過程自動化、智能化和柔性化的現代工廠。本整體規劃方案旨在通過整合信息技術、自動化技術、人工智能技術和物聯網技術&#xff0c;構建一個高效、靈活、綠色、可持續的生產環境&…

Day13 用Excel表體驗梯度下降法

Day13 用Excel表體驗梯度下降法 用所學公式創建Excel表 用Excel表體驗梯度下降法 詳見本Day文章頂部附帶資源里的Excel表《梯度下降法》&#xff0c;可以對照表里的單元格公式進行理解&#xff0c;還可以多嘗試幾次不同的學習率 η \eta η來感受&#xff0c;只需要更改學習率…

YOLOv8改進,YOLOv8引入Hyper-YOLO的MANet混合聚合網絡+HyperC2Net網絡

摘要 理論介紹 MANet 的目標是通過多種卷積操作的協同作用,提高特征提取能力,并加強梯度流動,從而提升模型在不同層次的特征表示和語義深度。MANet 結合了三種卷積變體,通過混合使用它們來提高視覺特征的多樣性和信息流動性。 HyperC2Net 的主要目標是通過超圖結構對多層次…