老規矩,先理解概念python
馮諾依曼體系:算法
輸入設備:鍵盤、鼠標安全
存儲器:內存多線程
輸出設備:顯示器、投影儀、打印機ide
程序:一個包含了代碼片被編譯後的文件函數
進程:系統經過解析程序文件加載到內存中的對象,進程是資源分配和調度的基本單位(分配cpu, 分配內存大小,它由系統進行調度),進程中包含指令(if, for…)、數據(變量,函數…)、線程(他也是線程的容器),他是操做系統結構的基礎。ui
線程:進程中真正幹活的人,線程是資源調度的最小單元,是程序執行流的最小單元,線程中包含線程id、當前指令的指針(線程會切換,再次運行還能從阻塞的位置繼續),寄存器集合(線程切換,這個線程執行的結果進行暫存)、堆棧(棧是先進後出,執行一個函數要先生成函數對象->函數壓棧->變量引用壓棧->調用函數->彈出棧頂,線程執行的其實也就是函數,從Thread的target參數就能看出來,它接收的是一個函數或則方法)spa
進程操作系統
註釋:線程
1:每個進程都認爲本身獨佔全部的計算機硬件資源()
2: 進程間不共享數據(這裏就要解決進程間通訊的問題)
線程
註釋:上邊已經大體講了一下線程,這裏再說一下線程的特色
1:一個進程中能夠有多個線程,同一個進程中的線程共享數據資源(這裏須要學好python中的做用域,由於python是用做用域來控制進程中的資源。另外就是先作一個預熱,既然共享資源就會出現線程安全的問題)
2:每個線程擁有本身獨立的堆棧。
3:線程的幾種狀態(就緒:處於沒有結束,也沒有在執行中間的一個狀態。運行:正在執行代碼片。阻塞:它在等待系統的處理結果,好比系統在執行IO。 終止:執行完成或則退出或則被取消)
4:python線程沒有優先級、沒有線程組的概念。
python-線程開發(threading庫)
threading的屬性和方法
方法 | 註釋 |
current_thread() | 獲取當前線程對象 |
main_thread() | 獲取主線程對象 |
active_count() | 獲取在運行的線程個數 |
enumerate() | 獲取主線程+未結束的線程對象 |
get_ident | 獲取當前線程的id |
Thread類->線程對象
Thread(target, name, args, kwargs)
Thread對象的方法
Thread對象方法 | 註釋 |
name | 對象的名字 |
ident | 對象的id |
is_alive() | 對象是否已經結束 |
啓動: start()與run()
start() | 啓動線程惟一的方法,start調用run方法 |
run() | 在當前線程執行函數調用,沒有開啓新的線程 |
結束:python沒有提供線程終止的方法
編號 | 終止的方法 |
1 | 被執行的代碼片中出現了異常 |
2 | 線程執行完成 |
3 | 對於循環的代碼片捕獲到某個編輯break了 |
線程安全:線程安全指的是,執行一段代碼或者調用一個函數,不會返回不肯定的結果
python中解決線程安全的方法:
1:使用線程安全的庫,或則使用線程安全的函數(python中的內置數據類型多數都是線程安全的,這樣對開發者也是有好處的,好比你在使用python並行開發的時候不用去考慮線程安全的問題,固然也有他的弊端)
註釋:好比print就是一個線程不安全的函數,他在多線程中執行的時候會被打斷(也就是cpu進行線程切換),那麼你就可使用線程安全的庫或則函數來替代,好比使用logging.info()來打印。
2:使用threading.lock()進行加鎖處理(在任何一門語言中,並行開發中,鎖的使用能規避則規避,由於鎖的使用要考慮不少的問題,好比死鎖,好比阻塞,好比加鎖解鎖的開銷,再好比須要技術大牛設計一個好的程序例如銀行家算法)
Thread類的daemon參數
一個進程中,必定有一個線程,這個線程就稱爲主線程,咱們使用Thread類建立的線程稱爲子線程,主線程daemon=False(也就是說他是一個non-daemon線程),咱們開啓的子線程若是沒有指定這個參數,那麼子線程默認繼承主線程的daemon=False,這個False有什麼做用呢,他的做用就是,假如只有一個子線程而且子線程爲non-daemon線程,那麼主線程就會等待子線程結束再結束(結束不等於退出,你能夠用threading.enumerate()打印看一下主線程爲stop狀態,可是並無退出,主線程退出整個進程就結束了),假如這個惟一的子線程爲daemon線程,那麼主線程結束,這個子線程就會結束了。第二種狀況,假如這個進程中有多個子線程,只要有一個子線程爲non-daemon線程,那麼主線程就會等待這個子線程結束再結束,若是爲daemon的線程沒有執行完,這個爲daemon的線程也會隨着主線程的結束而結束。
名稱 | 含義 |
daemon屬性 | 表示線程是不是daemon線程, 這個值必須在star()以前設置,不然報RuntimeError異常 |
isDaemon() | 是不是daemon線程 |
setDaemon | 設置爲daemon線程,必須在start()方法以前設置 |
daemon=True的應用場景,你不關心這個線程執行的代碼片是否必須執行完成。
Thread類對象的join方法
t.join()表示,誰執行t.join()這幾行代碼,那麼誰就要等待t,這個時候,因爲主線程/父線程沒有退出,那麼子線程即便爲daemon線程,子線程也不會退出(由於子線程daemon的退出是父線程退出了纔會quit這個線程)。
threading.local()
threading.Timer()
註釋:線程延時執行,他本質上是一個線程類,和線程的使用方法同樣,無非是等待一段時間執行,可是他提供了一個cancel()方法,在執行到cancel的時候,他的子線程則結束
協程