白話Python 進程,線程,協程

jopen 9年前發布 | 93K 次閱讀 Python Python開發

批評一個語言,多半是對這個語言不了解的人,夸獎一個語言,多半也是對這個語言不了解的人。--Q.yuhen

Python被人詬病最多的大概就是性能差,在這里講一下 Python 的多進程,多線程與協程。首先聲明這不是教程,看完這篇文章,大概能夠對 Python 的多進程與多線程有一定的了解。


白話Python 進程,線程,協程

進程</span>

</span>

進程是正則執行的程序實例。執行程序的過程中,內核會講程序代碼載入虛擬內存,喂程序變量分配空間,建立 bookkeeping 數據結構,來記錄與進程有關的信息,比如進程 ID,用戶 ID 等


創建進程的時候,內核會為進程分配一定的資源,并在進程存活的時候不斷進行調整,比如內存,進程創建的時候會占有一部分內存。進程結束的時候資源會釋放出來,來讓其他資源使用。


我們可以把進程理解為一種容器,容器內的資源可多可少,但是在容器內的程序只能使用容器內的東西。


線程</span>

</span>

UNIX 中,一個進程中可以執行多個線程。多個線程共享進程內的資源。所以可以將線程可以看成是共享同一虛擬內存以及其他屬性的進程。


線程相對于進程的優勢在于同一進程下的不同線程之間的數據共享更加容易。


Python被詬病最多的大概就是解釋器全局鎖 (GIL)了,GIL 的存在是為了實現 Python 中對于共享資源訪問的互斥。而且是非常霸道的解釋器級別的互斥。在 GIL 的機制下,一個線程訪問解釋器之后,其他的線程就需要等待這個線程釋放之后才可以訪問。這種處理方法在單處理器下面并沒有什么問題,單處理器的本質是無法 并行的。但是再多處理器下面,這種方法會導致無法利用多核的優勢。


Python 的線程調度跟操作系統的進程調度類似,都屬于搶占式的調度。一個進程執行了一定時間之后,發出一個信號,操作系統響應這個時鐘中斷(信號),開始進程調度。而在 Python 中,則通過軟件模擬這種中斷,來實現線程調度。


協程</span>

</span>

協程我們可以看成是一種用戶空間的線程,協程是主動的協作是工作,現有的操作系統線程調度是搶占式。兩種的區別在于協作是調度,需要之前的任務主動放棄時間片。


總結

</span>

在 Python 中,使用協程來做并發是對于系統資源消耗最小,可以最大化的做高并發,但是,需要我們自己來做調度,操作系統不會主動調度任務。


原文: http://segmentfault.com/blog/sunisdown/1190000000729609

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!