多進程、多線程

來源:互聯網
上載者:User

標籤:依賴   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()

多進程、多線程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.