python之進程、線程、協程的調度原理

來源:互聯網
上載者:User

標籤:htm   推薦   article   async   預設   main   一個棧   net   地址   

進程、線程和協程的調度和運行原理總結。

進程、線程的調度策略介紹

linux的作業系統詳細調度策略可參考:http://blog.csdn.net/gatieme/article/details/51872659

linux中的進程主要有三種調度策略:

  1. 優先順序調度:將進程分為普通進程和即時進程;

  2. 先進先出(隊列)調度:即時進程先建立的先執行,直到

  3. 輪轉調度(時間片):達到一定的CPU執行時間後強制切換;

多進程程式的調度其實還是線程的調度,線程才是CPU調度的基本單位;在同一個進程內線程切換不會產生進程切換,由一個進程內的線程切換到另一個進程內的線程時,將會引起進程切換。

引起進程or線程調度的原因
  • 正在執行的進程執行完畢;

  • 執行中進程發生阻塞;(如調用sleep)

  • 執行中進程調用了P原語操作,從而因資源不足而被阻塞;或調用了v原語操作啟用了等待資源的進程隊列;

  • 執行中進程提出I/O請求後被阻塞;

  • CPU分配的時間片用完;(預設10ms)

  • 就緒隊列中的某進程的優先順序變得高於當前執行進程的優先順序,引發強制切換;

linux下python進程or線程調度

如果我們使用python建立了多進程或多線程,可以認為這幾個進程或線程是在公平隊列(即優先順序相同)的即時進程,那麼其調度策略是FIFO和RR。

舉個例子,假設現在有一個單核的CPU,python程式建立了5個線程,這五個線程會安建立的時間先後進入到一個公平隊列中,CPU按先進先出原則開始執行第一個線程,如果遇到IO操作或休眠,或者執行這個線程的時間超過10ms;CUP就會停止當前線程,調到第二個線程執行直到第五個線程;然後又從第一個線程開始迴圈,直到所有的線程執行完畢資源被作業系統回收。

當然,切換進程或線程也需要付出代價的,進程切換的代價大於線程。

進程、線程和協程的資源比較

進程:

  • 建立一個進程後,每個進程擁有自己獨立的記憶體位址空間,程式碼片段,資料區段,BSS段,堆,棧等所有使用者空間的資訊;

  • 多進程中,子進程複製主進程的幾乎所有資訊,出pid等特殊資訊;

線程:

  • 一個進程下多個線程,多個線程共用進程的進程程式碼片段,進程的公有資料(堆),進程的所擁有其他輔助資源;

  • 各個線程獨立擁有的資源套件括:線程id,程式計數器,一個棧,計數器寄存器和棧用來儲存線程的執行曆史和執行狀態。

協程:

  • 協程可以看做輕量級的線程,即協程是線上程下開啟,多協程在單線程下實現並發,而作業系統最多隻能感知到線程,也就是說協程的切換對於作業系統來說是無感知的,屬於程式層級的切換;

  • 多個協程共用單線程的程式碼片段、公有資料(堆)等;

  • 每個協程擁有自己的棧來儲存上下文狀態,協程的切換開銷更小,對作業系統來說,會認為一個開啟了多協程的線程一直在計算;

  • 協程的優勢在於切換的代價更小,因此CPU的有效利用率得到了提高。

  • python的協程主流通過gevent和asyncio模組實現,它們的核心原理都是底層用代碼建立事件迴圈來對多個協程的上下文進行調度;

進程、線程和協程的應用情境
  • python的代碼盡量避免使用多線程;

  • 如果上下文有一段代碼可以分成相對獨立的兩個部分,如果獨立的兩個部分是CPU密集型,那麼使用多進程;如果是IO密集型,那麼使用協程;如果兩者都涉及,可以考慮使用子進程中運行協程。

  • 業務代碼為了快速建立協程或進程,同時增強代碼的可讀性,推薦使用匿名函數。

from redis import StrictRedisrs = StrictRedis(host=‘192.168.1.20‘, port=6390, db=1)def get_rs1():    t = time.time()    res = gevent.joinall([gevent.spawn(lambda x: gevent.sleep(2), x=i) for i in range(2)])    ls = [x.get() if x.kwargs[‘x‘] == 1 else x.get() for x in res]    print(ls)    print(time.time() - t)if __name__ == ‘__main__‘:    get_rs1()# gevent需要判斷返回的結果的順序
  • 參考

  • https://www.cnblogs.com/njczy2010/p/5800072.html

  • http://www.gevent.org/intro.html

python之進程、線程、協程的調度原理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.