python 進程/線程/協程區別

區別html

1、概念python

  一、進程web

進程是具備必定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。每一個進程都有本身的獨立內存空間,不一樣進程經過進程間通訊來通訊。因爲進程比較重量,佔據獨立的內存,因此上下文進程間的切換開銷(棧、寄存器、虛擬內存、文件句柄等)比較大,但相對比較穩定安全。安全

  二、線程多線程

線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),可是它可與同屬一個進程的其餘的線程共享進程所擁有的所有資源。線程間通訊主要經過共享內存,上下文切換很快,資源開銷較少,但相比進程不夠穩定容易丟失數據。併發

  三、協程異步

協程是一種用戶態的輕量級線程,協程的調度徹底由用戶控制。協程擁有本身的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其餘地方,在切回來的時候,恢復先前保存的寄存器上下文和棧,直接操做棧則基本沒有內核切換的開銷,能夠不加鎖的訪問全局變量,因此上下文的切換很是快。函數

 

2、區別:tornado

  一、進程多與線程比較post

線程是指進程內的一個執行單元,也是進程內的可調度實體。線程與進程的區別:
1) 地址空間:線程是進程內的一個執行單元,進程內至少有一個線程,它們共享進程的地址空間,而進程有本身獨立的地址空間
2) 資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
3) 線程是處理器調度的基本單位,但進程不是
4) 兩者都可併發執行

5) 每一個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口,可是線程不可以獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制

  二、協程多與線程進行比較

1) 一個線程能夠多個協程,一個進程也能夠單獨擁有多個協程,這樣python中則能使用多核CPU。

2) 線程進程都是同步機制,而協程則是異步

3) 協程能保留上一次調用時的狀態,每次過程重入時,就至關於進入上一次調用的狀態

 

 3、進程和線程、協程在python中的使用

  一、多進程通常使用multiprocessing庫,來利用多核CPU,主要是用在CPU密集型的程序上,固然生產者消費者這種也可使用。多進程的優點就是一個子進程崩潰並不會影響其餘子進程和主進程的運行,但缺點就是不能一次性啓動太多進程,會嚴重影響系統的資源調度,特別是CPU使用率和負載。使用多進程能夠查看文章《python 多進程使用總結》。注:python2的進程池在類中的使用會有問題,須要把類函數定義成全局函數。具體可參考 http://bbs.chinaunix.net/thread-4111379-1-1.html

  二、多線程通常是使用threading庫,完成一些IO密集型併發操做。多線程的優點是切換快,資源消耗低,但一個線程掛掉則會影響到全部線程,因此不夠穩定。現實中使用線程池的場景會比較多,具體可參考《python線程池實現》。

  三、協程通常是使用gevent庫,固然這個庫用起來比較麻煩,因此使用的並非不少。相反,協程在tornado的運用就多得多了,使用協程讓tornado作到單線程異步,聽說還能解決C10K的問題。因此協程使用的地方最多的是在web應用上。

總結一下就是IO密集型通常使用多線程或者多進程,CPU密集型通常使用多進程,強調非阻塞異步併發的通常都是使用協程,固然有時候也是須要多進程線程池結合的,或者是其餘組合方式。

相關文章
相關標籤/搜索