并发编程:进程,线程,协程,异步
生活随笔
收集整理的這篇文章主要介紹了
并发编程:进程,线程,协程,异步
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
并發編程(不是并行)目前有四種方式:多進程、多線程、協程和異步。
- 多進程編程在python中有類似C的os.fork,更高層封裝的有multiprocessing標準庫
- 多線程編程python中有Thread和threading
- 異步編程在linux下主+要有三種實現select,poll,epoll
- 協程在python中通常會說到yield,關于協程的庫主要有greenlet,stackless,gevent,eventlet等實現。
進程
- 不共享任何狀態
- 調度由操作系統完成
- 有獨立的內存空間(上下文切換的時候需要保存棧、cpu寄存器、虛擬內存、以及打開的相關句柄等信息,開銷大)
- 通訊主要通過信號傳遞的方式來實現(實現方式有多種,信號量、管道、事件等,通訊都需要過內核,效率低)
線程
- 共享變量(解決了通訊麻煩的問題,但是對于變量的訪問需要加鎖)
- 調度由操作系統完成(由于共享內存,上下文切換變得高效)
- 一個進程可以有多個線程,每個線程會共享父進程的資源(創建線程開銷占用比進程小很多,可創建的數量也會很多)
- 通訊除了可使用進程間通訊的方式,還可以通過共享內存的方式進行通信(通過共享內存通信比通過內核要快很多)
協程
- 調度完全由用戶控制
- 一個線程(進程)可以有多個協程
- 每個線程(進程)循環按照指定的任務清單順序完成不同的任務(當任務被堵塞時,執行下一個任務;當恢復時,再回來執行這個任務;任務間切換只需要保存任務的上下文,沒有內核的開銷,可以不加鎖的訪問全局變量)
- 協程需要保證是非堵塞的且沒有相互依賴
- 協程基本上不能同步通訊,多采用異步的消息通訊,效率比較高
總結
- 進程擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,進程由操作系統調度
- 線程擁有自己獨立的棧和共享的堆,共享堆,不共享棧,線程亦由操作系統調度(標準線程是的)
- 協程和線程一樣共享堆,不共享棧,協程由程序員在協程的代碼里顯示調度
聊聊協程
協程,又稱微線程,纖程。
Python的線程并不是標準線程,是系統級進程,線程間上下文切換有開銷,而且Python在執行多線程時默認加了一個全局解釋器鎖(GIL),因此Python的多線程其實是串行的,所以并不能利用多核的優勢,也就是說一個進程內的多個線程只能使用一個CPU。
傳統的生產者-消費者模型是一個線程寫消息,一個線程取消息,通過鎖機制控制隊列和等待,但容易死鎖。
如果改用協程,生產者生產消息后,直接通過yield跳轉到消費者開始執行,待消費者執行完畢后,切換回生產者繼續生產,效率極高。
總結
以上是生活随笔為你收集整理的并发编程:进程,线程,协程,异步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ISTQB高级-测试经理国际认证试题及答
- 下一篇: 探索测试 | 新奇深层测试策略之案例剖析