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