進程與線程 併發與並行python
進程與線程安全
首先要理解的是,咱們的軟件都是運行在操做系統之上,操做系統再控制硬件,好比 處理器、內存、IO設備等。操做系統爲了向上層應用程序提供 簡單一致 的機制來控制複雜而又截然不同的低級硬件設備 抽象出 進程 的概念。進程是比較重量級的操做系統資源,它擁有獨立的內存空間,而在 現代操做系統中爲了實如今一個進程中執行多種任務,所以實現了 線程。 一個 進程 能夠由多個 線程組成,每一個 線程 是一個執行單元,線程 運行在 進程 的上下文環境中,並共享 一樣的代碼和全局數據。
咱們常常說的 多線程 就是指的 在一個進程內有多個線程在執行任務,在實際開發中,開發者寫的代碼其實都是在線程的環境中執行的,而在多線程開發中,常常涉及到 一些 線程安全的問題,簡單的看下進程 和 線程佔有的資源狀況多線程
簡單的理解 線程安全 的問題:多線程程序在運行時候,可能會同時對一個變量進行操做,操做的時候,通常線程會將這個變量的值 copy 到 自身線程的鉅變變量中,再進行操做,此時可能就會發生 讀寫時數據不一樣步(數據已經被其餘線程操做了,自身線程操做時讀取的值已是舊的了)的問題。併發
併發與並行 操作系統
進程 能夠申請和擁有系統資源,進程是一個實體,程序的執行依賴於、主存(存放程序和程序處理的數據) CPU(執行代碼) 等…(好比IO),而進程至關於一個環境,是控制這些操做系統硬件的實體,在操做系統中,一個系統上能夠運行多個進程,運行的進程通常是多於運行它們的CPU 個數的, 因此一般一個CPU 可能須要運行多個進程任務,一個CPU 就像是一個工人,他一個時間節點只能作一件事情,因此 CPU 得頻繁的在多個 進程中切換(上下文切換),這種現象就是併發執行。
並行執行的概念是指 多個程序在多個CPU上同時執行,「並行」 概念是 併發 概念的一個子集,咱們能夠編寫一個 並行程序,可是若是沒有足夠的 CPU 來執行,那麼最終就變成了併發執行.net
併發:同時有不少任務須要作,能夠串行執行也能夠並行執行
並行:能夠同時(嚴格意義上的)作多個任務線程
做者:zhuoxiuwu
來源:CSDN
原文:https://blog.csdn.net/zhuoxiu...
版權聲明:本文爲博主原創文章,轉載請附上博文連接!設計
----------------------------------------
----------------------------------------blog
有句行話: 「python下多線程是雞肋,推薦使用多進程!」
爲何呢?進程
看兩點:
一、GIL是什麼?GIL的全稱是Global Interpreter Lock(全局解釋器鎖),來源是python設計之初的考慮,爲了數據安全所作的決定。
二、每一個CPU在同一時間只能執行一個線程(在單核CPU下的多線程其實都只是併發,不是並行,併發和並行從宏觀上來說都是同時處理多路請求的概念。但併發和並行又有區別,並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多個事件在同一時間間隔內發生。)
在Python多線程下,每一個線程的執行方式:
1.獲取GIL
2.執行代碼直到sleep或者是python虛擬機將其掛起。
3.釋放GIL
可見,某個線程想要執行,必須先拿到GIL,咱們能夠把GIL看做是「通行證」,而且在一個python進程中,GIL只有一個。拿不到通行證的線程,就不容許進入CPU執行。
因此python裏,不管如何都無法GIL致使的同一時間只能執行一個線程的問題,因此效率依然不盡如人意。
又有名言: 「python下想要充分利用多核CPU,就用多進程」。
這又是爲何呢?
緣由是:每一個進程有各自獨立的GIL,互不干擾,這樣就能夠真正意義上的並行執行,因此在python中,多進程的執行效率優於多線程(僅僅針對多核CPU而言)。
做者:知我莫言
來源:知乎
原文:https://zhuanlan.zhihu.com/p/...
本身總結一下:
一個process只有一個GIL
一個process能夠理解成 a bundle of threads
一個 CPU core 在某一時刻,只能有一個thread。
所以一個 CPU core 在某一時刻,天然也只能有一個Process。
可是不一樣的cpu core能夠同時有同一個Process假設有 4核CPU 和 4個processCPU0,CPU1,CPU2, CPU3 能夠同時處理 process0