執行緒是最小的執行單元,程序是最小的資源管理單元、
序列 就是傳統意義上的,同步,順序的意思
程序:計算機中乙個程式在乙個資料集上 一次動態執行的過程,主要包含三部分內容
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 生命週期 我們的...