1. 程式人生 > >多執行緒多程序協程的區別和不同的應用場景

多執行緒多程序協程的區別和不同的應用場景

當然既然是都是 多這個字開頭,那麼就是多工,我們需要了解

併發:指的是任務數多餘cpu核數,通過作業系統的各種任務排程演算法,

        實現⽤多個任務“⼀起”執⾏(實際上總有⼀些任務不在執⾏,因為切換任    
        務的速度相當快,看上去⼀起執⾏⽽已)

並⾏:指的是任務數⼩於等於cpu核數,即任務真的是⼀起執⾏的

多執行緒(threading):①在⼀個程序內的所有執行緒共享全域性變數,很⽅便在多個執行緒間共享資料

            ②缺點就是,執行緒是對全域性變數隨意遂改可能造成多執行緒之間對全域性變數

                的混亂(即執行緒⾮安全)

            ③如果多個執行緒同時對同⼀個全域性變數操作,會出現資源競爭問題,從⽽

                資料結果會不正確

解決執行緒同時修改全域性變數的⽅式:互斥鎖(互斥鎖為資源引⼊⼀個狀態:鎖定/⾮鎖定
某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為“鎖定”,其他
執行緒不能更改;直到該執行緒釋放資源,將資源的狀態變成“⾮鎖定”,其他的
執行緒才能再次鎖定該資源。互斥鎖保證了每次只有⼀個執行緒進⾏寫⼊操作,
從⽽保證了多執行緒情況下資料的正確性。)

多程序(multiprocessing):程序不共享全域性變數

                                              如果子程序因為某種原因崩潰了,不會直接導致主程式的崩潰,可以降低主程式崩潰的概率;

                                                  即使主程序退出了,子程序仍然可以繼續工作,比如子程序是推送服務,在主程序退出的情況下,仍然能夠保證使用者可以收到推送訊息。


協程(greenlet,gevent升級版):

            ①⽐執行緒更⼩佔⽤更⼩執⾏單元(理解為需要的資源)

            ②它是⼀個執⾏單元,因為它⾃帶CPU上下⽂

              通俗的理解:在⼀個執行緒中的某個函式,可以在任何地⽅儲存當前函式的⼀
些臨時變數等資訊,然後切換到另外⼀個函式中執⾏,注意不是通過調⽤函
數的⽅式做到的,並且切換的次數以及什麼時候再切換到原來的函式都由開
發者⾃⼰確定

程序,能夠完成多工,⽐如 在⼀臺電腦上能夠同時運⾏多個QQ
執行緒,能夠完成多工,⽐如 ⼀個QQ中的多個聊天窗⼝

定義的不同
程序:是系統進⾏資源分配和排程的⼀個獨⽴單位.
執行緒:是程序的⼀個實體,是CPU排程和分派的基本單位,它是⽐程序更⼩的
          能獨⽴運⾏的基本單位.執行緒⾃⼰基本上不擁有系統資源,只擁有⼀點在運
          ⾏中必不可少的資源(如程式計數器,⼀組暫存器和棧),但是它可與同屬⼀
          個程序的其他的執行緒共享程序所擁有的全部資源.
區別
    ⼀個程式⾄少有⼀個程序,⼀個程序⾄少有⼀個執行緒.
    執行緒的劃分尺度⼩於程序(資源⽐程序少),使得多執行緒程式的併發性⾼。        
    程序在執⾏過程中擁有獨⽴的記憶體單元,⽽多個執行緒共享記憶體,從⽽極        

⼤地提⾼了程式的運⾏效率

    線執行緒不能夠獨⽴執⾏,必須依存在程序中
    可以將程序理解為⼯⼚中的⼀條流⽔線,⽽其中的執行緒就是這個流⽔線
上的⼯⼈

優缺點:執行緒和程序在使⽤上各有優缺點:執行緒執⾏開銷⼩,但不利於資源的管理和

            保護;⽽程序正相反。

協程和執行緒差異
在實現多工時, 執行緒切換從系統層⾯遠不⽌儲存和恢復 CPU上下⽂這麼簡
單。 作業系統為了程式運⾏的⾼效性每個執行緒都有⾃⼰快取Cache等等數
據,作業系統還會幫你做這些資料的恢復操作。 所以執行緒的切換⾮常耗性
能。但是協程的切換隻是單純的操作CPU的上下⽂,所以⼀秒鐘切換個上百
萬次系統都抗的住。

小結:

1. 程序是資源分配的單位

2. 執行緒是作業系統排程的單位
3. 程序切換需要的資源很最⼤,效率很低
4. 執行緒切換需要的資源⼀般,效率⼀般(當然了在不考慮GIL的情況下)

5. 協程切換任務資源很⼩,效率⾼

6. 多程序、多執行緒根據cpu核數不⼀樣可能是並⾏的,但是協程是在⼀個線
程中 所以是併發

應用場景:

多執行緒 : 常見的瀏覽器、Web服務(現在寫的web是中介軟體幫你完成了執行緒的控制),web處理請求,各種專用伺服器(如遊戲伺服器)

需要頻繁建立銷燬的優先用執行緒

需要進行大量計算的優先使用執行緒(CPU頻繁切換

多程序:使用場所:目標子動能互動少,如果資源和效能許可,可以設計由多個子應用程式來組合完成目的