1. 程式人生 > >多進程、多線程

多進程、多線程

解析 網絡 ces 容器 必須 sin start 至少 由於

多進程、多線程

[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()

多進程、多線程