1. 程式人生 > >Python cpu與cpu上的多執行緒的區別講解

Python cpu與cpu上的多執行緒的區別講解

你對Python 多執行緒有所瞭解的話。那麼你對python 多執行緒在單cpu意義上的多執行緒與多cpu上的多執行緒有著本質的區別。
Python多執行緒是單cpu意義上的多執行緒,它和多cpu上的多執行緒有著本質的區別。
單cpu多執行緒:併發
多cpu多執行緒:並行內部包含併發
        在Python 多執行緒當中,存在一個叫Global Interpreter Lock(GIL)的東西,直譯就是全域性直譯器鎖。它的作用在於讓同一時刻只能有一個執行緒對於python物件進行操作。Python已經提供了各種機制讓我們進行多執行緒同步,為什麼又要整這個GIL呢?這是因為程式設計師控制的同步是對各個程式中可見的變數,而GIL同步的是直譯器後臺的不可見變數,比如為了進行垃圾回收而維護的引用計數。如果沒有GIL,有可能出現由於執行緒切換導致的對同一個物件釋放兩次的情況。
        因此,任何一個CPython執行緒如果要執行,就必須先獲取這個GIL。後果?就是在CPython中,本質上幾乎是沒有執行緒並行的,不論你開多少個執行緒,同一時刻只有獲取GIL的那個執行緒能夠執行。為什麼要說幾乎呢,這是因為提供給python的C庫中,還是有解決方案的,比如
        這段程式碼是sleep的程式碼,在執行sleep之前,通過一個巨集來釋放GIL,然後在睡眠結束執行其他程式碼前又獲取GIL。其他一下操作,比如IO,也會有類似的操作,這樣就使得對於IO密集型的程式,或者是使用C庫進行計算的程式,還是可以在很大程度上避開GIL來取得執行緒並行的效果的。但對於純 python程式碼的程式,GIL恐怕還是躲不過去的。
還有一個問題,就是GIL怎麼釋放,我們看到在python/C API中提供了巨集來進行釋放,那麼對於普通的python語句呢?直譯器會在執行一百條python程式碼後強制釋放GIL,這就使得其它執行緒得以執行。
        最後需要說明的,就是這個GIL的問題是直譯器相關的,而不是語言相關的。也就是說它只是對於python語言直譯器的一種實現,並不是語言本身的特性。事實上,GIL就是直譯器的一個非常粗粒度的鎖,我們完全可以採用更細粒度的鎖來增加並行性,而且Gindo就寫過一個patch來取消 GIL,不過好像最後的結果是細粒度鎖導致了單執行緒程式的效能下降了兩倍,所以最後還是決定優先保證單執行緒程式的效能,繼續保留GIL。但是python 的其他兩個分支,Jython和IronPython,卻都沒有GIL的問題,從而可以實現執行緒的並行。
總結:
通常加鎖也有2種不同的粒度的鎖:
fine-grained(所謂的細粒度), 那麼程式設計師需要自行地加,解鎖來保證執行緒安全
coarse-grained(所謂的粗粒度), 那麼語言層面本身維護著一個全域性的鎖機制,用來保證執行緒安全
Python 多執行緒 從語言層面本身維護著一個全域性的鎖機制,用來保證執行緒安全;而java, Jython則是細粒度的。
所以也就是說,由於gil的限制,python語言本身是不能夠進行並行
程式設計
的,但是可以進行併發程式設計;而java則沒有gil意義上的限制,因此java從java7開始已經開始往並行上偏移了。

相關推薦

CPU核數跟執行的關係

一直以來有這樣的疑惑,單核CPU適合多執行緒嗎?是不是幾個核的CPU開幾個執行緒是最合適的? 今天就這一問題查了一些資料,現整理如下:     要說多執行緒就離不開程序,程序和執行緒的區別在這裡就不詳細說了,只將關鍵的幾點: a)程序之間是相互獨立的,不共享記憶體和資料

Objective-C高階程式設計:iOSOS X執行和記憶體管理

這篇文章主要給大家講解一下GCD的平時不太常用的API,以及文末會貼出GCD定時器的一個小例子。 需要學習的朋友可以通過網盤免費下載pdf版 (先點選普通下載-----再選擇普通使用者就能免費下載了)http://putpan.com/fs/cy1i1beebn7s0h4u9/ 1.G

[讀書筆記]iOSOS X執行和記憶體管理 [GCD部分]

3.2 GCD的API 蘋果對GCD的說明:開發者要做的只是定義想執行的任務並追加到適當的Dispatch Queue中。 “Dispatch Queue”是執行處理的等待佇列。通過dispatch_async函式等API,在Block

python 念聽網mp3執行工下載

#coding=utf-8 import requests import threading import re class downloader: # 建構函式 def __init__(self,downloadurl): # 設定url

基於VB 實時資料採集處理的執行設計

0 引言  在多種視覺化程式語言中,VB 具有介面設計功 能強的特點 ,選擇它作為開發平臺 ,可以快速地建立 應用程式。該特點使其在測控系統的資料採集和處 理中應用比較廣泛 ,但是在資料實時處理時 ,往往出 現執行操作介面的選單命令明顯反應變慢 ,操作不 便 ,實時監控資料時引發了程式阻塞。

網路爬蟲必備知識之concurrent.futures庫 python究竟要不要使用執行

就庫的範圍,個人認為網路爬蟲必備庫知識包括urllib、requests、re、BeautifulSoup、concurrent.futures,接下來將結對concurrent.futures庫的使用方法進行總結 建議閱讀本博的博友先閱讀下上篇部落格: python究竟要不要使用多執行緒,將會對co

python技巧——使用threadpool實現執行並行

可以使用 threadpool 來實現多程序並行。 示例 我想用多執行緒求一個數列的和,可以如下操作: import threadpool def func(dic, c): dic['count'] += c if __name__=="__main__":

Python併發程式設計系列之執行

1引言 2 建立執行緒   2.1 函式的方式建立執行緒   2.2 類的方式建立執行緒 3 Thread類的常用屬性和方法   3.1 守護執行緒:Deamon   3.2 join()方法 4 執行緒間的同步機制   4.1 互斥鎖:Lock   4.2 遞迴鎖:RLock   4.3

Python 實用程式設計技巧(執行篇)

一、GIL(global_interpreter_lock) 1.概念: Python 一開始為了簡單,在多執行緒程式設計的時候會在我們的直譯器上加一個非常大的鎖,也就是允許我們一次只有一個執行緒執行在一個CPU上,gil 就能實現在同一時刻只有一個執行緒在CPU上執行位

Python並行程式設計(十):執行效能評估

1、基本概念       GIL是CPython直譯器引入的鎖,GIL在直譯器層面阻止了真正的並行執行。直譯器在執行任何執行緒之前,必須等待當前正在執行的執行緒釋放GIL,事實上,直譯器會強迫想要執行的執行緒必須拿到GIL才能訪問直譯器的任何資源,例如棧或Python物件等,這也正是GIL的目的,為了阻止不同

python用map()函式和執行threading、Thread採集注意事項

import re import requests from threading import Thread def getUrl(): url = 'http://www.xiaohuar

Python爬蟲(十八)_執行糗事百科案例

多執行緒糗事百科案例 案例要求參考上一個糗事百科單程序案例:http://www.cnblogs.com/miqi1992/p/8081929.html Queue(佇列物件) Queue是python中的標準庫,可以直接import Queue引用;佇列時執行緒間最常用的互動資料的形式。 pytho

Python爬蟲入門教程,執行採集鬥圖啦表情包!

寫在前面 今天在CSDN部落格,發現好多人寫爬蟲都在爬取一個叫做鬥圖啦的網站,裡面很多表情包,然後瞅了瞅,各種實現方式都有,今天我給你實現一個多執行緒版本的。關鍵技術點 aiohttp ,你可以看一下我前面的文章,然後在學習一下。 https://github.com/wangde

PyQt訊號槽之執行中訊號槽的使用(六)

簡單多執行緒訊號與槽的使用 最簡單的多執行緒使用方法是利用QThread函式,展示QThread函式和訊號簡單結合的方法 import sys from PyQt5.QtCore import

字元流位元組流 執行

(Input)輸入流:輸入流指的是將資料以字元或位元組形式從外部媒介比如檔案、資料庫等讀取到記憶體中。通過JAVA程式讀取硬碟上的某個檔案內容就需要使用輸入流。(Output)輸出流:輸出流指的是將記憶體中的資料寫入外部媒介。通過JAVA程式將內容寫入到硬碟上的某個檔案就需要

讀《Objective-C高階程式設計iOSOS X執行和記憶體管理》

最近一週,公司在廣州有釋出會。去廣州的人很忙,留在公司的開發人員有時也很“忙”。趁著空閒的時間,看了《Objective-C高階程式設計iOS與OS X多執行緒和記憶體管理》這書,網上找的pdf版本。 這本書分三給部分,依次是ARC、Blocks和GCD。 ARC從非

Tensorflow學習筆記:變數作用域、模型的載入儲存、執行佇列實現執行讀取樣本

# tensorflow變數作用域     用上下文語句規定作用域     with tf.variable_scope("作用域_name")         ......

python核心程式設計-練習】| 執行程式設計

1. 程序與執行緒。執行緒與程序的區別是什麼? 什麼是程式? 計算機程式只不過是磁碟中可執行的,二進位制(或其它型別)的資料。程式是靜態的,可修改的檔案資料; 什麼是程序? 程序是程式被讀取到記憶體中,被作業系統呼叫的時候程式的一次執行過程

python爬蟲進階使用執行爬取小說

Python多執行緒,thread標準庫。都說Python的多執行緒是雞肋,推薦使用多程序。 Python為了安全考慮有一個GIL。每個CPU在同一時間只能執行一個執行緒      GIL的全稱是Global Interpreter