1. 程式人生 > >python多執行緒和GIL全域性直譯器鎖

python多執行緒和GIL全域性直譯器鎖

1、執行緒

    執行緒被稱為輕量級程序,是最小執行單元,系統排程的單位。執行緒切換需要的資源一般,效率一般。 

2、多執行緒

        在單個程式中同時執行多個執行緒完成不同的工作,稱為多執行緒

3、併發:

    作業系統同時執行幾個程式,這幾個程式都由一個cpu處理,但在一個時刻點上只有一個程式在cpu上處理

4、並行:

    作業系統同時執行2個程式,但是有兩個cpu,每個cpu處理一個程式,叫並行

5、序列: 

    是指的我們從事某項工作是一個步驟一個步驟去實施   

一、多執行緒

#python3是假的多執行緒,它不是真真正正的並行,其實就是序列,只不過利用了cpu上下文的切換而已
 1 mport threading
 2 import time
 3 # def test1():
 4 #     for i in range(10):
 5 #         time.sleep(1)             #睡1s
 6 #         print('test1=========>%s' % i)
7 # 8 # 9 # def test2(): 10 # for i in range(10): 11 # time.sleep(1) 12 # print('test2=========>%s' % i) 13 # 14 # t1 = threading.Thread(target=test1) #定義一個執行緒 target=函式名 15 # t2 = threading.Thread(target=test2) 16 # t1.start() #開啟執行緒 17 # t2.start() 18
# test1() 19 # test2()

# 多執行緒是無序的,併發的 因為在啟動一個執行緒時,執行緒不會立即執行,而是等待cpu的資源排程。
1 # def test1(n):
2 #     time.sleep(1)
3 #     print('task', n)
4 # for i in range(10):
5 #     t = threading.Thread(target=test1,args=('t-%s' % i,))  #args= 後接輸出結果  末尾必須加 “ , ” 號
6 #     t.start()
  #計算併發所用的時間
 1  
 2 # import threading
 3 # import time
 4 # def dest(n):
 5 #     time.sleep(1)
 6 #     print('this is running====>%s' %n)
 7 # l = []     #定義一個空列表
 8 # start = time.time()     #開始的時間
 9 # for i in range(10):        #10個程序
10 #     t = threading.Thread(target=dest,args=(i,))    
11 #     t.start()
12 #     l.append(t)      #把執行緒執行時間加入到列表
13 # for g in l:       
14 #     g.join()            #等待全部執行緒執行完畢
15 # end = time.time()            #執行結束時間
16 # print('time',(end-start))   #執行結束時間 - 開始執行的時間
 
 1 import threading
 2 import time
 3 def test1(n):
 4     time.sleep(1)
 5     print('test1====>%s' %n)
 6 def test2(n):
 7     time.sleep(2)
 8     print('test2====>%s' %n)
 9 start = time.time()
10 l = []
11 t1 =  threading.Thread(target=test1,args=(1,))
12 t2 = threading.Thread(target=test2,args=(2,))
13 t1.start()
14 t2.start()
15 l.append(t1)
16 l.append(t2)
17 for i in l:
18     i.join()
19 end = time.time()
20 print('time',(end - start))
View Code   #多執行緒共享全域性變數
 1 # g_num = 0
 2 # def update():
 3 #     global g_num    #global宣告全域性變數
 4 #     for i in range(10):
 5 #         g_num += 1
 6 #
 7 # def reader():
 8 #     global g_num
 9 #     print(g_num)
10 #
11 # t1 = threading.Thread(target=update)
12 # t2 = threading.Thread(target=reader)
13 # t1.start()
14 # t2.start()
15  

二、GIL全域性直譯器鎖

相關推薦

python執行GIL全域性直譯器

1、執行緒     執行緒被稱為輕量級程序,是最小執行單元,系統排程的單位。執行緒切換需要的資源一般,效率一般。  2、多執行緒         在單個程式中同時執行多個執行緒完成不同的工作,稱為多執行緒 3、

python3執行GIL全域性直譯器

GIL的全稱是:Global Interpreter Lock,意思就是全域性直譯器鎖,這個GIL並不是python的特性,他是隻在Cpython直譯器裡引入的一個概念,而在其他的語言編寫的直譯器裡就沒有這個GIL例如:Jython,Pypy 為什麼會有gil?:      

關於python執行GIL全域性的一些見解

GIL全域性鎖是:Python語言和GIL沒有半毛錢關係。僅僅是由於歷史原因在Cpython虛擬機器(直譯器),難以移除GIL.每個執行緒在執行的過程都需要先獲取GIL,保證同一時刻只有一個執行緒可以執行程式碼。作用就是保證同一時刻只有一個執行緒可以執行程式碼,造成了我們使用多執行緒的時候無法實

搞定python執行程序

參考 https://www.cnblogs.com/whatisfantasy/p/6440585.html 1 概念梳理: 1.1 執行緒 1.1.1 什麼是執行緒 執行緒是作業系統能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中一個

從零開始學Python(八):Python執行佇列

很久沒有更新博文啦,在家過春節已經變懶了-_-,不過答應大家更完這個python的入門系列,偶還是會繼續努力的!另外祝願大家新年快樂,事事順心! 執行緒的概念 我們學習的很多程式語言,比如java,oc等,都會有執行緒這個概念.執行緒的用途非常的廣泛,給

Python執行下的全域性變數、區域性變數

最近開發一個新功能遇到一個問題,就是在一個A.py檔案生成2個執行緒,呼叫B.py裡的函式,B.py裡面有若干global定義全域性變數,導致程式得不到想要的結果。B.py檔案裡面的全域性變數,被A.py裡面的2個執行緒所共享,一個執行緒改變了他們的值,另外一個執行緒讀取到

再談Python執行--避免GIL對效能的影響

在Python中使用多執行緒,如果你對GIL本身沒有一定的瞭解;那麼很有可能你只是寫出了正確的多執行緒程式碼,而並沒有達到多執行緒的目的,甚至截然相反的效果。下面介紹了Python中GIL的作用和侷限性,並提供了避免GIL影響效能的幾個建議。 GIL是CPython中特有

Python執行讀寫檔案加

Python的多執行緒在io方面比單執行緒還是有優勢,但是在多執行緒開發時,少不了對檔案的讀寫操作。在管理多個執行緒對同一檔案的讀寫操作時,就少不了檔案鎖了。 使用fcntl 在linux下,python的標準庫有現成的檔案鎖,來自於fcntl模組。這個模組提供了unix

Python執行中阻塞(join)與(Lock)的使用誤區

關於阻塞主執行緒 join的錯誤用法 Thread.join() 作用為阻塞主執行緒,即在子執行緒未返回的時候,主執行緒等待其返回然後再繼續執行. join不能與start在迴圈裡連用 以下為錯誤程式碼,程式碼建立了5個執行緒,然後用一個迴圈啟用執行緒,

python執行程式設計(3): 使用互斥同步執行

問題的提出 上一節的例子中,每個執行緒互相獨立,相互之間沒有任何關係。現在假設這樣一個例子:有一個全域性的計數num,每個執行緒獲取這個全域性的計數,根據num進行一些處理,然後將num加1。很容易寫出這樣的程式碼: # encoding: UTF-8import

Python 執行 程序 全域性直譯器GIL join

Python 程式碼的執行由Python 虛擬機器(也叫直譯器主迴圈)來控制。Python 在設計之初就考慮到要在主迴圈中,同時只有一個執行緒在執行,就像單CPU 的系統中執行多個程序那樣,記憶體中可以存放多個程式,但任意時刻,只有一個程式在CPU 中執行。同樣地,雖然Py

網路程式設計之執行——GIL全域性直譯器

網路程式設計之多執行緒——GIL全域性直譯器鎖 一、引子 定義: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python b

Python執行程序協程的例項講解

執行緒、程序和協程是什麼 執行緒、程序和協程的詳細概念解釋和原理剖析不是本文的重點,本文重點講述在Python中怎樣實際使用這三種東西 參考: 程序、執行緒、協程之概念理解 程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。執

python執行——1、GIL

一、GIL是什麼?        執行緒全域性鎖(Global Interpreter lock),python保護執行緒安全而採取的獨立執行緒執行的限制。      1、明確一點GIL並不是python的特性,pytho

Python 執行,(全域性變數)資料共享,threading.Lock() 互斥

  demo.py(互斥鎖): import threading import time # 定義一個全域性變數 g_num = 0 def test1(num): global g_num # 全域性變數可以實現執行緒間資料共享。也可以通過傳參實現 fo

Python 執行程序 (一)之 原始碼執行流程、GIL

Python 多執行緒、多程序 (一)之 原始碼執行流程、GIL Python 多執行緒、多程序 (二)之 多執行緒、同步、通訊 Python 多執行緒、多程序 (三)之 執行緒程序對比、多執行緒 一、python程式的執行原理 許多時候,在執行一個python檔案的時候,會發現在同一目錄下會出現一個__

python執行-共享全域性變數

目錄 多執行緒-共享全域性變數 多執行緒-共享全域性變數 列表當作實參傳遞到執行緒中 總結 多執行緒-共享全域性變數問題 多執行緒開發可能遇到的問題 測試1 測試2 多執行緒-共享全域性變數 多執行緒-共享全域性變

Python中單執行執行程序的效率對比實驗

Python是執行在直譯器中的語言,查詢資料知道,python中有一個全域性鎖(GIL),在使用多程序(Thread)的情況下,不能發揮多核的優勢。而使用多程序(Multiprocess),則可以發揮多核的優勢真正地提高效率。 對比實驗 資料顯示,如果多執行緒的程序是CPU密集型的,那多執行緒並不能有多少

Python執行的理解使用(一)Threading中join()函式的理解

1. 多執行緒的概念 多執行緒類似於同時執行多個不同程式,多執行緒執行有如下優點: 使用執行緒可以把佔據長時間的程式中的任務放到後臺去處理。 使用者介面可以更加吸引人,這樣比如使用者點選了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度  程式的執行速

Python 執行 threadingmultiprocessing模組

執行緒是一個程序的實體,是由表示程式執行狀態的暫存器(如程式計數器、棧指標)以及堆疊組成,它是比程序更小的單位。 執行緒是程式中的一個執行流。一個執行流是由CPU執行程式程式碼並操作程式的資料所形成的。因此,執行緒被認為是以CPU為主體的行為。 執行緒不包含