Python并發-線程和進程

一、線程和進程對應的問題

**1.進程:**CPU密集型也叫計算密集型,指的是系統的硬盤、內存性能相對CPU要好很多,此時,系統運作大部分的狀況是CPU Loading 100%,CPU要讀/寫I/O(硬盤/內存),I/O在很短的時間就可以完成,而CPU還有許多運算要處理,CPU Loading很高。
**2.線程:**IO密集型指的是系統的CPU性能相對硬盤、內存要好很多,此時,系統運作,大部分的狀況是CPU在等I/O (硬盤/內存) 的讀/寫操作,此時CPU Loading并不高。

二、進程

定義:進程是程序在某個數據集合上的一次運行活動,也是操作系統進行資源分配和保護的基本單位。
每個進程都有獨立的代碼和數據空間(進程上下文),進程間的切換會有較大的開銷,一個進程包含1–n個線程。(進程是資源分配的最小單位)
CPython解釋器本身就不是線程安全的,因此有全局解釋器鎖(GIL),一次只允許使用一個線程執行Python字節碼。因此,一個Python進程通常不能同時使用多個CPU核心。
在這里插入圖片描述
Python中的多進程實現:
futures.ProcessPoolExecutor類。現在流行multiprocessing模塊。

import multiprocessing# 定義一個函數,用于在多個進程中執行任務
def worker_function(index):print(f"Worker {index} started")result = index * 2print(f"Worker {index} result: {result}")print(f"Worker {index} finished")if __name__ == "__main__":# 創建一個進程池,可以指定要創建的進程數(這里為3)num_processes = 3pool = multiprocessing.Pool(processes=num_processes)# 使用進程池執行任務# 這里將任務分配給三個進程并行執行pool.map(worker_function, range(num_processes))# 關閉進程池,等待所有進程完成pool.close()pool.join()print("All workers have finished")

還有一種更簡單的,使用

https://zhuanlan.zhihu.com/p/509084322

三、線程

進程中的一個執行任務(控制單元),負責當前進程中程序的執行。一個進程至少有一個線程,一個進程可以運行多個線程,多個線程可共享數據。
在這里插入圖片描述
線程和進程都具有一砂鍋五個狀態。
Python中的實現:

import threading# 定義一個函數,用于在線程中執行任務
def worker_function(thread_id):print(f"Thread {thread_id} started")# 在這里可以執行一些任務print(f"Thread {thread_id} finished")if __name__ == "__main__":# 創建多個線程num_threads = 3threads = []for i in range(num_threads):thread = threading.Thread(target=worker_function, args=(i,))threads.append(thread)# 啟動所有線程for thread in threads:thread.start()# 等待所有線程完成for thread in threads:thread.join()print("All threads have finished")

四、二者的區別

多進程和多線程都是用于并發編程的技術,但它們有一些共性和區別:

共性:

  1. 并發性: 無論是多進程還是多線程,它們都允許在程序中執行多個任務,并在不同的執行上下文中交替執行這些任務,從而實現并發性。

  2. 共享資源: 多進程和多線程都可以訪問共享的內存資源,這允許多個任務之間進行數據交換和共享數據。

  3. 并行執行: 在多核或多 CPU 的系統上,多進程和多線程都可以實現真正的并行執行,從而提高程序的性能。

區別:

  1. 獨立性:

    • 多進程:每個進程都有獨立的內存空間和 Python 解釋器,它們之間彼此獨立,因此一個進程的錯誤通常不會影響其他進程。
    • 多線程:所有線程共享同一進程的內存空間,它們之間共享全局變量和數據。因此,一個線程的錯誤可能會影響其他線程和整個進程。
  2. 創建和銷毀:

    • 多進程:創建和銷毀進程通常比較慢,并且需要更多的系統資源,因為每個進程都有獨立的內存空間。
    • 多線程:創建和銷毀線程通常更快,因為它們共享進程的內存空間,但線程之間的管理和同步可能更復雜。
  3. 并發性和并行性:

    • 多進程:可以在多個 CPU 上并行執行,因此適用于 CPU 密集型任務。然而,多進程之間的通信開銷相對較高。
    • 多線程:在單個 CPU 上的并發性較強,適用于 I/O 密集型任務,但由于 GIL 的存在,多線程不能實現真正的多核并行。
  4. 同步和鎖:

    • 多進程:通常需要使用進程間通信(Inter-Process Communication,IPC)機制來實現進程之間的協作,例如管道、隊列和共享內存。
    • 多線程:線程之間可以更容易地共享數據,但需要使用鎖(例如互斥鎖)來確保線程安全。
  5. 資源開銷:

    • 多進程:通常比多線程消耗更多的內存和系統資源。
    • 多線程:相對較輕量,消耗的資源較少。

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

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

相關文章

C語言之函數

目錄 main函數和庫函數 什么是函數 函數定義 函數頭(function header) 1.返回類型(return type) 2.函數名(function name) 3.形參聲明(parameter type list) 函數體&#xff…

mybatisplus手動獲取數據源執行非主數據庫事務

mybatisplus手動獲取數據源執行非主數據庫事務 class A {// 事務管理器Resourceprivate DataSourceTransactionManager dataSourceTransactionManager;Autowiredprivate DataSource dataSource; // 最終是com.baomidou.dynamic.datasource.DynamicRoutingDataSource類型public…

通過靜態HTTP實現負載均衡

在當今的互聯網環境中,隨著用戶數量的不斷增加和業務需求的不斷擴大,單臺服務器往往無法承受所有的訪問壓力。為了確保網站的可用性和性能,負載均衡成為了一種常見的解決方案。本文將探討如何通過靜態HTTP實現負載均衡,以提升網站…

認識系統服務daemons

什么是daemon與服務(service) 常駐內存的是進程,可以提供一些系統或網絡功能,這就是服務。實現service的程序稱為daemon。也就是說要想提供某種服務,daemon實在后臺運行的。 daemon的分類: 1)可獨立啟動…

【CSP】202209-1_如此編碼Python實現

文章目錄 [toc]試題編號試題名稱時間限制內存限制題目背景題目描述輸入格式輸出格式樣例1輸入樣例1輸出樣例2輸入樣例2輸出樣例3輸入樣例3輸出樣例3解釋子任務提示Python實現 試題編號 202209-1 試題名稱 如此編碼 時間限制 1.0s 內存限制 512.0MB 題目背景 某次測驗后&#x…

【Angular開發】2023年促進您開發的最佳Angular庫

如果你是一名開發人員,你可以理解平臺的重要性,它可以加快開發過程,顯著減少編碼時間和工作量。 根據StackOverflow開發者2021年的調查,Angular是其中一個令人驚嘆的平臺,它一直贏得人們的喜愛,并獲得了全…

【vtkWidgetRepresentation】第六期 vtkFinitePlaneRepresentation

很高興在雪易的CSDN遇見你 ,給你糖糖 歡迎大家加入雪易社區-CSDN社區云 前言 本文分享VTK中的平面Plane表示方法,希望對各位小伙伴有所幫助! 感謝各位小伙伴的點贊關注,小易會繼續努力分享,一起進步! …

機器人阻抗控制直觀(圖示理解)與控制框架/架構

在剛性碰撞下,機器人的阻抗調節可以使其更好地適應外部環境。具體來說,通過建立力與位移之間的關系,并改變阻抗參數,可以控制機器人對外部力的響應。 在具體實現上,可以采用基于位置的阻抗控制或基于力的阻抗控制。基于…

【Java 基礎】26 枚舉

文章目錄 1. 什么是枚舉2. 定義3. 使用1)常量2)遍歷3)switch 4. 屬性和方法1)屬性2)方法 5. 實現原理6. 使用場景總結 1. 什么是枚舉 枚舉是列出某些有窮序列集的所有成員的程序,或者是一種特定類型對象的計…

Windows下使用CMD修改本地IP

在網絡適配器界面查看當前網線連接的哪個網口,我當前連的是 以太網 這個名字的: 在windows下使用管理員權限打開CMD命令工具,輸入如下命令(如我想本地ip改成192.168.2.4): netsh interface ip set address "以太網" st…

LeetCode Hot100 78.子集

題目: 給你一個整數數組 nums ,數組中的元素 互不相同 。返回該數組所有可能的子集(冪集)。 解集 不能 包含重復的子集。你可以按 任意順序 返回解集。 方法:靈神 選 or 不選 class Solution {private final List&…

spring 的概述和入門

? 我是南城余!阿里云開發者平臺專家博士證書獲得者! 歡迎關注我的博客!一同成長! 一名從事運維開發的worker,記錄分享學習。 專注于AI,運維開發,windows Linux 系統領域的分享! …

信號量的使用和注意事項

大家好,今天給大家介紹信號量的使用和注意事項,文章末尾附有分享大家一個資料包,差不多150多G。里面學習內容、面經、項目都比較新也比較全!可進群免費領取。 信號燈(信號量)集 POSIX 線程中的同步用的是無名信號量 進程間的同步使…

喬拓云平臺:微信小程序開發的全新視角與高效路徑

隨著微信小程序的日益普及,越來越多的人開始關注如何開發自己的小程序。對于沒有開發經驗的人來說,借助第三方平臺如喬拓云,可以輕松實現小程序的開發。本文將介紹微信小程序開發需要學習的東西,并探討如何借助喬拓云平臺進行無經…

基于深度學習的鋼鐵缺陷檢測系統(含UI界面,Python代碼,數據集、yolov8)

項目介紹 項目中所用到的算法模型和數據集等信息如下: 算法模型: ? ? yolov8 yolov8主要包含以下幾種創新: ? ? ? ? 1. 添加注意力機制(SE、CBAM等) ? ? ? ? 2. 修改可變形卷積(DySnake-主干c…

【改進YOLOv8】融合可變形大核注意力D-LKA-Attention的油氣管道設備泄露檢測系統

1.研究背景與意義 項目參考AAAI Association for the Advancement of Artificial Intelligence 研究背景與意義 隨著油氣管道設備的廣泛應用,油氣泄露問題已經成為一個嚴重的環境和安全隱患。油氣泄露不僅會造成環境污染,還可能引發火災、爆炸等嚴重事…

掌握vue中國際化使用及配置

文章目錄 🍁i18n組件安裝🍁項目中配置 vue-i18n🍁編寫語言包🍁國際化的使用 隨著互聯網的普及和全球化的發展,開發國際化的應用程序已經成為一種趨勢。因此,將 VUE 應用程序國際化是非常有必要的。 以下是…

新時代商業旨意:傳統商家如何變革?

隨著新時代的到來,商業環境也在不斷變化。在這個信息爆炸、消費者需求日益復雜化的時代,商業旨意已經不再僅僅是追求利潤,而是轉向了以客戶為中心,追求價值共創、社會責任等多元化的目標。傳統商家面臨著諸多挑戰,如何…

2023四川大學“騰訊杯”新生賽(同步賽)糖果(鴿巢原理)

這個數據范圍, n 是 1 e 6 , a i 也是 1 e 6 n是1e6,a_i也是1e6 n是1e6,ai?也是1e6,任意 a i a j ∈ [ 0 , 2 e 6 ] a_ia_j \in [0, 2e6] ai?aj?∈[0,2e6],所以如果有答案我們最多枚舉 2 e 6 2e6 2e6個數就可以找到…

視頻剪輯高手揭秘:如何批量減少時長并調整播放速度,提升視頻效果

隨著社交媒體的興起,視頻制作的需求越來越大。然而往往視頻文件存在一些問題,例如時長過長,或者要調整播放速度以更好地傳達信息。這些問題不僅影響了視頻的觀看體驗,也可能導致視頻難以在社交媒體上獲得廣泛的傳播。那么&#xf…