標籤:依賴 int gil 資源分派 windows name 計算 集合 多個
多進程、多線程
[toc]
線程
線程是==作業系統能夠進行運算調度的最小單位(程式執行流的最小單元)==。它被包含在進程之中,是進程中的實際運作單元。一條線程指的是進程中==一個單一順序的控制流程==,一個進程中可以並發多個線程,每條線程並存執行不同的任務。
一個標準的線程有線程ID、當前指令指標(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和指派的基本單元,線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其他線程共用進程所擁有的全部資源。一個線程可以建立和撤銷另一個線程,同一進程中的多個線程之間可以並發執行。由於線程之間的相互制約,致使線程在運行中呈現處間斷性。
線程也有就緒、阻塞和運行三種基本狀態。就緒狀態是指線程具備啟動並執行所有條件,邏輯上可以運行,在等待處理機;運行狀態是指線程佔有處理機正在運行;阻塞狀態是指線程在等待一個事件(如某個訊號量),邏輯上不可執行。每一個程式都至少有一個線程,若程式只有一個線程,那就是程式本身。
線程是程式中==一個單一的順序控制流程程。進程內一個相對獨立的、可調度的執行單元,是系統獨立調度和指派CPU的基本單元==。在單一程式中同時運行多個想成完成不同的工作,稱為多線程。
進程
進程是電腦中的程式關於某資料集合上的一次運行活動,是系統進行資源分派和調度的基本單元,是作業系統結構的基礎。在早期面向進程設計的電腦結構中,進程是程式的基本執行實體;在當代面向線程設計的電腦結構中,進程是線程的容器。程式是指令、資料機器組織形式的描述,進程是程式的實體。裡麵包含對各種資源的調用,記憶體的管理,網路介面的調用等。
線程和進程的區別
- 線程共用記憶體空間;進程的記憶體是獨立的
- 同一個進程的線程之間可以直接交流;兩個進程想通訊,必須通過一個中間代理來實現
- 建立新進程很簡單;建立新進程需要對其父進程進行一個複製
- 一個線程可以控制和操作同一進程裡的其他線程;但是進程只能操作子進程
- 改變注線程(如優先權),可能會影響其他線程;改變父進程,不影響子進程
python GIL(Global Interpreter Lock)
python GIL 稱為 python全域解譯器鎖,表示無論你啟動多少個線程,你有多少個cpu,Python在執行的時候都只會在同一時刻只允許一個線程運行。
需要明確的一點是GIL並不是Python的特性,它是在實現Python解析器(CPython)時所引入的一個概念。就好比C++是一套語言(文法)標準,但是可以用不同的編譯器來編譯成可執行代碼。有名的編譯器例如GCC,INTEL C++,Visual C++等。Python也一樣,同樣一段代碼可以通過CPython,PyPy,Psyco等不同的Python執行環境來執行。像其中的JPython就沒有GIL。然而因為CPython是大部分環境下預設的Python執行環境。所以在很多人的概念裡CPython就是Python,也就想當然的把GIL歸結為Python語言的缺陷。所以這裡要先明確一點:GIL並不是Python的特性,Python完全可以不依賴於GIL
因此,這種偽多線程的情況在Cpython解譯器中是存在的,但在其他解譯器就可能不存在,如Jpython。因此:GIL並不是python的特性,Python完全可以不依賴於GIL
參考
Python實現多進程
import multiprocessing 5 import time,threading 6 7 def thread_id(): 8 """獲得線程ID。""" 9 print(" thread..")10 print("thread_id:%s\n" % threading.get_ident())11 12 def hello(name):13 time.sleep(2)14 print("hello %s..." % name)15 # 啟一個線程16 t = threading.Thread(target=thread_id,)17 t.start()18 19 if __name__ == "__main__": # windows環境下必須寫這句,不寫會報錯20 for i in range(10):21 # 啟一個進程和一個線程的文法都差不多22 p = multiprocessing.Process(target=hello,args=("progress %s" % i,))23 p.start()
多進程、多線程