什麼是多執行緒與多程序?

2022-07-26 13:15:11 字數 4446 閱讀 8665

執行緒是最小的執行單元,程序是最小的資源管理單元、

序列 就是傳統意義上的,同步,順序的意思

程序:計算機中乙個程式在乙個資料集上 一次動態執行的過程,主要包含三部分內容

01>程式:描述程序的功能以及處理流程

02>資料集:功能處理過程中需要的資源資料

03>程序控制:嚴格控制程序執行過程中的各種狀態

通俗來說,乙個程序就是計算機上正在執行的乙個程式

乙個軟體程式要執行,需要將軟體依賴的資料載入到記憶體中,通過cpu進行運算並按照程式定義的邏輯結構進行流程控制,直到資料處理完成後程式退出

在程式實際執行過程中,程序只是分配需要的資料資源,是程式的主體,在程式執行時真正運的是執行緒,每個程序至少會有乙個執行緒

執行緒計算機中程式執行的實際執行者,每乙個程序至少會有乙個執行緒(主線程)用於執行程式

執行緒和程序的對比

1.乙個程序可以有多個執行緒,但是至少有乙個主線程

2.乙個執行緒只能屬於乙個程序

3.乙個程序中多個執行緒,可以共享程序中提供的資料

4.cpu運算分配給執行緒,cpu上執行運算的是執行緒

多執行緒程式設計

python2標準模組thread和threading

python3 將thread模組進行規範內建,更名為_thread(不推薦使用)推薦使用threading

import _thread

_thread.start_new_thread(function,args,kwargs = none)

function 執行緒要用到的方法

args 引數

主線程一旦執行結束,子執行緒立即停止執行

python中的多執行緒

threading模組的多執行緒併發程式設計機制,主要有兩種操作方式

01 函式式的執行緒建立方式,適合面向過程程式的開發程式設計實現

02 物件導向的建立方式,適合物件導向程式的併發程式設計實現

threading的模組屬性和方法(例舉幾個)

thread 執行緒類:用於建立和管理執行緒

event 事件類:用於執行緒同步

condition 條件類:用於執行緒同步

lock/rlock 上鎖/解鎖

active_count() 獲取當前alive狀態的所有執行緒數量

current_thread() 獲取當前正在執行的執行緒物件

get_ident() 獲取執行中程式當前執行緒的唯一編號

barrir 執行緒同步型別(wait:等待最後乙個執行緒執行,所有執行緒同時執行)

ex:獲取當前存活的所有執行緒

threading.active_cout()

獲取當前執行緒物件

threadind.current_thread()

threading.current_thread().getname()

threading.get_ident

獲取主線程隊象

threading.main_thread()

threading.main_thread.getname()

thread型別屬性和方法

init(group執行緒組,target目標函式,name,args可變引數,kwargs) 構造方法,建立執行緒型別

is_alive() 判斷當前執行緒是否alive狀態

srart() 執行緒啟動方法

run() 執行緒執行方法,不可主動呼叫,呼叫start會自動呼叫run

join([timeout = none]) 執行緒獨佔,等待當前執行緒執行結束或者超時

daemon 布林值,判斷當前執行緒是否是守護執行緒

建立執行緒

threading.thread()

t1.daemon = true

守護屬性:如果一旦乙個人被設定守護執行緒=true,該執行緒會隨著主線程結束

運算和渲染不同步,有延時,人看不出來,對於計算機比較明顯

《面試》問:為什麼主線程執行完畢,守護執行緒還在執行

答:因為運算和渲染不同步,運算早就結束了,但是渲染到桌面展示上還需要一定時間,人看不出來,對於計算機比較明顯

join() 獨佔屬性

t1.join(self,timeout)

timeout 可以設定獨佔時間,在一定時間內只執行t1,等t1執行結束,才會執行其他執行緒

上鎖/解鎖 (lock/rlock 互斥鎖/可重用鎖)

引用方法

lock = threading.lock()

上鎖lock.acquire()

if lock.acquire():(一般加if判斷語句)

解鎖lock.release()

注意解鎖後是否跳出迴圈,不然容易死鎖, 鎖不會釋放

event

queue

condition

多程序程式設計

多核->多硬體執行緒->多程序->多執行緒

->程序是正在執行中的應用,乙個程序包含了該應用程式的所有資訊,乙個應用程式根據其功能的多樣性,可以通過多個程序併發的形式實現

python多程序開發

->multiprocessing模組

通過該模組的process程序型別,可以很方便的建立和管理多個程序

multiprocessing常見屬性和方法

process 程序型別,用於建立和管理程序

lock/rlock 程序互斥鎖/可重用鎖,用於程序同步

event 程序事件型別,用於程序同步

condition 程序條件型別,用於程序同步

queue 程序佇列型別,用於多程序資料共享

manager 專門進行資料共享的操作,本地共享,不同主機之間的網路共享

listener\client 監聽(伺服器)\客戶端,基於網路多程序之間的共享

建立程序 ->multiprocessing.process(target,args)

os.getpid() 程式的程序編號

os.getppid() 當前的程序是由哪個程序產生

process的引數

1.name

2.daemon 是否守護程序

3.quthkey 認證碼

4.exitcode 程序退出的乙個錯誤碼

5,join 占用

多程序中列印當前程序名稱 multiprocessing.current_process().name

程序池(process pool)->存放多個程序的池塘

如果程式只是關注函式功能的運算執行->多程序只是乙個多工執行,而不是多工的管理

程序池:可以直接 申請多個程序 提交你的任務即可

把所有任務交給程序池裡面的程序處理,處理速度變快

**重點

在使用程序池的時候,一定要先對程序池停止提交 不然程序池會一直接收事件不會執行,

該程序池就無法申請記憶體去執行,所以是乙個無效的程序池,直接退出。所以要在主程式結束前停止提交,告訴主程序,程序池準備完畢,可以申請記憶體。pool.close(),然後開始獨佔執行執行程序池中的程序,pool.join(),如果不停止直接執行,程式會直接結束

程序池中的程序,預設是主程序的守護程序,主程序一旦結束,程序池裡面的子程序結束

程序池的操作->把函式交給程序池處理,程序池中維護的程序會同時處理完成提交的任務->主動停止提交->獨佔執行->程序池裡面的維護的程序就會處理任務

程序開始執行->執行函式download(得到資料之後單獨執行另外乙個函式)->執行下乙個程序

由系統決定什麼時候呼叫 callback **

多程序間的資料呼叫共享

1.全域性變數可以被多個程序共享

2.多個程序使用的同乙個全域性變數的值是共享的

全域性變數在多程序下資料是分離的

建立乙個當前程序的時候就會把需要執行的方法和變數拷貝乙份,執行的是拷貝的資料,不會對全域性變數進行更改

可用multiprocessing的條件物件 condition

可用multiprocessing的queue

寫多執行緒版本的一對一聊天(可以一直發訊息,不用等伺服器回覆)需求分析

需要完成兩個人互發資訊,而且一次可以發多條資訊,不需要一條一條的接收

引入模組 threading,socket

多執行緒與多程序

程序 程序是程式的一次執行,在傳統的計算機中,程序既是基本的分配單元,也是基本的執行單元。執行緒 執行緒是可執行的實體單元,它是處理機排程的基本單位。由於執行緒在同一位址空間,因此建立和撤銷執行緒的開銷小,執行緒間的通訊效率高,切換迅速。在多處理機系統中,對程序的個數有所限制,但對執行緒的個數不存在...

多執行緒與多程序

魚還是熊掌 多程序多執行緒的選擇 關於多程序和多執行緒,教科書上最經典的一句話是 程序是資源分配的最小單位,執行緒是cpu排程的最小單位 這句話應付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有這麼簡單了,選的不好,會讓你深受其害。經常在網路上看到有的xdjm問 多程序好還是多執行緒好?...

多程序與多執行緒

import threading建立乙個執行緒,指向的函式,不接收引數的情況 t threading.thread target 函式名 建立乙個執行緒,指向的函式,收引數的情況 t threading.thread target 函式名,args 實參1,執行緒物件名.start 生命週期 我們的...