多工介紹
簡單來說就是作業系統可以同時執行過個任務
單核cpu作業系統會讓各個任務交替執行
真正的多工只能在多核cpu上實現,也就是並行和併發
2- 併發
併發:指的是任務數多於cpu核數,通過作業系統的各種任務排程演算法,實現用多個任務「一起」執行(實際上總有一些任務不在執行,因為切換任務的速度相當快,看上去一起執行而已)
3- 並行
並行:指的是任務數小於等於cpu核數,即任務真的是一起執行的
執行緒
執行緒
執行緒:python的thread模組是比較底層的模組,python的threading模組是對 thread做了一些包裝的更加方便的被使用
1.使用threading模組:當使用多執行緒併發的操作,花費的時間要短很多,當呼叫start()時,
才會真正的建立執行緒,並且開始執行
2.主線程會等待所有的子執行緒結束後才結束
3.檢視執行緒數量:length = len(threading.enumerate())
print('當前執行的執行緒數為:%d' % length)
注意:
注意:
1.執行緒執行**的封裝:通過使用threading模組能夠完成多工的程式開發,
為了讓每個執行緒的封裝性更完美,所以使用threading模組時,
往往會定義乙個新的子類class,只要繼承threading.thread就可以了,然後重寫run
方法。python中的threading.thread類中有乙個run方法,用於定義執行緒的功能函式,
可以在自己的執行緒類中覆蓋該方法。而建立自己的執行緒例項後,通過thread類
的start方法,可以啟動該執行緒,當該執行緒獲得執行的機會時,就會run方法執行執行緒
2. 執行緒的執行順序:多執行緒程式的執行順序是不確定的,當執行到sleep語句時,
執行緒將被阻塞(blocked),到sleep結束後,執行緒將進入就緒(runnable)狀態,
等待排程。而執行緒排程將自行選擇乙個執行緒執行。只能保證每個執行緒都執行完整
但是執行緒的啟動順序,run函式中每次迴圈的執行順序都不能確定
3. 1).每個執行緒預設有乙個名字,python會自動為執行緒指定乙個名字
2).當執行緒的run()方法結束時該執行緒完成
3).無法控制線程排程程式,但可以通過別的方式來影響執行緒排程的方式
5-多執行緒
多執行緒開發可能遇到的問題:
如果多個執行緒同時對乙個全域性變數操作,會出現資源競爭問題,從而資料結果會不正確
多執行緒—共享全域性變數:
在乙個程序內的所有執行緒共享全域性變數,很方便在多個執行緒間共享資料
缺點就是,執行緒是對全域性變數隨意修改可能造成多執行緒之間的全域性變數的 混亂 (即執行緒非安全)
6 互斥鎖
互斥鎖:
當多個執行緒幾乎同時修改某乙個共享資料時,需要進行同步控制
最簡單的同步機制是引入互斥鎖。
互斥鎖為資源引入乙個狀態:鎖定/非鎖定
優點:確定了某段關鍵**只能由乙個執行緒從頭到尾完整的執行
缺點:效率下降,造成死鎖
並且同時等待對方的資源,就會造成死鎖,一旦發生就會造成應用的停止響應
避免死鎖:
程式設計時要盡量避免
新增超時時間
7.注意
執行緒排程順序不確定,主線程會等待子執行緒,函式執行完畢執行緒結束,執行緒越多程式執行速度越慢
多個子執行緒同時操作乙個變數會出現資源競爭問題,可以用互斥鎖解決。互斥鎖會出現死鎖現象,避免這個問題核心問題是邏輯上避免。或者新增超時時間
在執行過程中**不會變,所以**是共享的資料可能會變,所以會分配記憶體給子程序
寫時拷貝,修改就會拷貝,不修改就共享
Python 多工之協程(3)實現多工
學習理解迭代器和生成器之後,開始使用協程來實現多工 當乙個函式中包含yield關鍵字,那麼這個函式就不再是乙個普通的函式,它的返回值是乙個生成器物件。我們可以使用next 或send 函式來啟動喚醒生成器物件,當程式第一次執行到yield時,程式暫停執行,並返回yield後邊跟的變數,當再次喚醒時,...
yield實現多工演示
import time deftask1 任務1函式 i 0while true print in task1 time.sleep 1 主程式中通過next 拿到yield後面的值 生成器物件.send 傳送的資料 這時傳送的資料傳遞到yield,當做yield的返回值 result yield ...
Xcode實現多工程編譯
在開發專案時,有時候需要依賴其他的工程 通常是第三方開源的靜態庫工程 網上有很多第三方開源庫都是以乙個靜態庫工程提供給開發者的 比如codova,cocoapods等 其次,我們自己可以建乙個這樣的靜態庫工程,專門用來放自己在實際開發中用的比較多的技術,比如一些幫助類,一些好的技術封裝等等。這樣在開...