python 線程、進程區別與事例

線程:簡單來說,一個進程中包含多個線程,比如打開一個 QQ(進程),然后你一邊聊 QQ(一個線程),一邊用 QQ 傳送文件(一個線程),等等。在一個進程內部,要同時干多件事,就需要同時運行多個“子任務”,我們把進程內的這些“子任務”稱為線程( Thread )。
進程是CPU資源分配的基本單位,
線程是獨立運行和獨立調度的基本單位(CPU上真正運行的是線程)。
進程擁有自己的資源空間,一個進程包含若干個線程,線程與CPU資源分配無關,多個線程共享同一進程內的資源。
在大多數編程語言中因為切換消耗的資源更少,多線程比多進程效率更高

對于python:
對CPU密集型代碼(比如循環計算,海量運算,機器學習等) : 多進程效率更高
對IO密集型代碼(比如文件操作,網絡爬蟲): 多線程效率更高。

進程multiprocessing

import multiprocessing
import os
from multiprocessing import cpu_count
from multiprocessing import Pool
import time
if __name__ == '__main__':N = int(input())# 多進程CPU_COUNT =cpu_count()  ##CPU內核數 本機為8pool = Pool(CPU_COUNT)#進程池創建result = []for i in range(CPU_COUNT):result.append(pool.apply_async(howMany, (sepList[i], )))#創建進程
#Pool對象調用join方法,會等待所有的子進程執行完畢;
#調用join方法之前,必須調用close;
#調用close之后,就不能繼續添加新的Process了。pool.close()#pool.join()ans = 0list = [res.get() for res in result]print(sum(list), end = '')

鎖案例

import multiprocessing
def func(lock, data):lock.acquire()try:# 在這里對共享數據進行操作data.value += 1finally:lock.release()if __name__ == '__main__':lock = multiprocessing.Lock()data = multiprocessing.Value('i', 0)p1 = multiprocessing.Process(target=func, args=(lock, data))p2 = multiprocessing.Process(target=func, args=(lock, data))p1.start()p2.start()p1.join()p2.join()print(data.value)

鎖:l.acquire()
釋放 l.release()
pool.close() 關閉進程池,無法通過該進程池再創建新進程
pool.join() 主進程阻塞等待子進程的退出


線程:threading

if __name__ == '__main__':N = int(input())threadNum = 32t = []sepList = seprateNum(N, threadNum)for i in range(0, threadNum):t.append(threading.Thread(target = howMany, args = (sepList[i], )))t[i].start()for i in range(0, threadNum):t[i].join()print(N - 1 - ans, end = '')
lock = threading.Lock()
lock.acquire()#互斥鎖 保證一個線程在運行時不會讀到這個global_num += 1lock.release()

為了更好解決這個問題,Python 線程庫實現了 ThreadLocal 變量(很多語言都有類似的實現,比如 Java)。ThreadLocal 真正做到了線程之間的數據隔離,并且使用時,不需要手動獲取自己的線程 ID,如下示例:

import threading
global_data = threading.local()def show():print (threading.current_thread().getName(), global_data.num)
def thread_cal():global_data.num = str(threading.current_thread().getName()).split("-")[1]show()thread = []
for i in range(10):thread.append(threading.Thread(target = thread_cal))thread[i].start()
for i in range(10):thread[i].join()print ("Main thread: ", global_data.__dict__ )

輸出為每個線程名稱
上面示例中,每個線程都可以通過 global_data.num, 獲得自己獨有的數據,并且每個線程讀取到的 global_data 都不同,真正做到線程之間的隔離。c0ab1072ab50e3eaaa6a0f3726c6bb7e.png

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

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

相關文章

Linux中如何執行腳本

要執行一個保存在文件中的腳本,可以按照以下步驟進行: 1. 創建腳本文件: 首先,使用文本編輯器(如 ?vi?、?nano?等)創建一個新的腳本文件,并將需要執行的命令寫入到文件中。例如&#xff0…

【Unity】在Unity中導出WebGL并讀取Excel數據的實現方法

在游戲開發中,數據的處理和導出是至關重要的環節之一。Unity作為一款強大的游戲開發引擎,提供了豐富的工具和功能來處理和導出數據,包括將游戲導出為WebGL應用,并讀取外部數據文件,比如Excel表格。本文將介紹如何在Uni…

gpt生成器,批量gpt文章生成器

GPT(生成式預訓練模型)生成器軟件在當今的數字化時代扮演著越來越重要的角色,它們通過人工智能技術,可以自動生成各種類型的文章內容,為用戶提供了無限的創作可能性。本文將介紹6款不同的GPT生成器軟件,并介…

STM32自學?AD單通道

程序的最終運行成果: 當轉動電位器時,數值和電壓值發生變化 ad.c文件 #include "stm32f10x.h" #include "stm32f10x_adc.h" #include "ad.h" #include "stdint.h" void ad_Init(void) { /* 初始化步驟:…

java學習筆記-初級

一、變量 1.雙標簽 <!-- 外部js script 雙標簽 --><script srcmy.js></script> 在新文件my.js里面寫&#xff1a; 2.字符串定義&#xff1a; //外單內雙var str 我是一個"高富帥"的程序員;console.log(str);// 字符串轉義字符 都是用 \ 開頭 …

并發編程中常見的設計模式,c++多線程如何設計

C多線程設計&#xff08;任務的“多對一”、“一對多”、“多對多”情況 該如何設計線程&#xff1f;&#xff09; C書籍中并未找到對多線程設計&#xff0c;有很完整詳細的總結&#xff01;&#xff01;C并發編程書籍中也只是一些理論或則零散的多線程實例。無奈&#xff0c;…

MySQL-MHA搭建、故障測試

一、架構說明 MHA&#xff08;Master High Availability&#xff09;是一個用于 MySQL 主從復制管理和自動故障轉移的開源工具集。MHA 的主要目的是提供 MySQL 環境的高可用性和自動故障轉移功能&#xff0c;確保在主庫發生故障時能夠快速切換到備庫&#xff0c;降低業務中斷時…

ElasticSearch之Completion Suggester

寫在前面 通過completion suggester可以實現如下的效果&#xff1a; 其實就是做的like xxx%這種。通過FST這種數據結構來存儲&#xff0c;實現快速的前綴匹配&#xff0c;并且可以將es所有的數據加載到內存中所以速度completion的查詢速度非常快。 需要注意&#xff0c;如果…

JWT令牌的使用教程

一、導入maven依賴 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency> 二、導入JWT工具類 &#xff08;工具類&#xff09; import io.jsonwebtoken.Cl…

HUAT——Fasc——算法組學習筆記

目錄 系列文章目錄 前言 一、配置相關環境 二、創建工作空間 1.創建工作空間并初始化 2.進入 src 創建 ros 包并添加依賴 三、HelloWorld(C版) 1.進入 ros 包的 src 目錄編輯源文件 2.編輯 ros 包下的 Cmakelist.txt文件 3.進入工作空間目錄并編譯 四 運行程序 五 …

docker 基礎(二)

常見命令 Docker最常見的命令就是操作鏡像、容器的命令&#xff0c;詳見官方文檔&#xff1a;https://docs.docker.com/ 數據卷 命令說明文檔地址docker volume create創建數據卷docker volume createdocker volume ls創建數據卷docker volume lsdocker volume rm查看所有數…

asp.net core webapi接收application/x-www-form-urlencoded和form-data參數

框架&#xff1a;asp.net core webapiasp.net core webapi接收參數&#xff0c;請求變量設置 目錄 接收multipart/form-data、application/x-www-form-urlencoded類型參數接收URL參數接收上傳的文件webapi接收json參數 接收multipart/form-data、application/x-www-form-urlenc…

Swiper實現輪播效果

swiper官網&#xff1a;https://3.swiper.com.cn/ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title&…

中間件-Nginx加固(控制超時時間限制客戶端下載速度并發連接數)

中間件-Nginx加固&#xff08;控制超時時間&限制客戶端下載速度&并發連接數&#xff09; 1.1 Nginx 控制超時時間配置1.2 Nginx 限制客戶端下載速度&并發連接數 &#x1f496;The Begin&#x1f496;點點關注&#xff0c;收藏不迷路&#x1f496; 1.1 Nginx 控制超…

TypeScript07:枚舉enum

一、擴展類型 擴展類型&#xff1a;類型別名、枚舉、接口、類。 枚舉&#xff1a;通常用于約束某個變量的取值范圍。 字面量和聯合類型配合使用&#xff0c;也可以達到同樣的目標。 二、字面量類型的問題 在類型約束位置&#xff0c;會產生重復代碼。可以使用類型別名解…

PSMC:繪圖腳本 psmc_plot.pl 腳本參數詳解

=> psmc_plot.plUsage: psmc_plot.pl [options] <out.prefix> <in.psmc>Options: -u FLOAT absolute mutation rate per nucleotide [2.5e-08]-s INT skip used in data preparation [100]-X FLOAT maximum generations,

機器學習圖像識別如何處理標簽以外的圖像?

機器學習圖像識別技術是一種基于人工智能的圖像處理方法&#xff0c;它通過訓練大量的圖像數據集來讓計算機學習如何識別和分類圖像。在圖像識別任務中&#xff0c;我們通常需要對圖像進行標注和分類&#xff0c;以便讓計算機能夠從中學習。但是&#xff0c;有時候我們可能會遇…

大數據旅游數據分析:基于Python旅游數據采集可視化分析推薦系統

文章目錄 基于Python旅游數據采集可視化分析推薦系統一、項目概述二、項目說明三、開發環境四、功能實現五、系統頁面實現用戶登錄注冊系統首頁數據操作管理價格與銷量分析旅游城市和景點等級分析旅游數據評分情況分析旅游數據評論情況分析旅游景點推薦Django系統后臺管理 六、…

centos7 安裝python3.8運行導入ssl報錯,親測驗證有效版

centos安裝python3.7時遇到如下問題&#xff0c;查閱知需要的openssl版本最低為1.0.2&#xff0c;但是centos 默認的為1.0.1&#xff0c;所以需要重新更新openssl import _ssl # if we cant import it, let the error propagate ImportError: No module named _ssl1、安…

【前端早早聊直播回顧】Harmony 時代的跨端方案

上周末&#xff0c;凡泰極客CTO - 徐鵬受邀出席「前端早早聊」直播活動&#xff0c;并以【跨端新挑戰-鴻蒙時代的跨端】為主題進行演講。 摘取部分分享實錄&#xff1a; 終端系統的數量和種類不斷增長&#xff0c;開發者面臨著多平臺開發的挑戰。以往開發者一般只需要維護iOS、…