python入門python的基本語法
1045
2025-04-02
多線程是一種廣泛的編程和執行模型,該模型允許在一個進程的上下文中存在多個線程。這些線程中的每一個都可以并行運行,并且這些線程共享相似的地址空間。那么,讓我們從頭開始說。
什么是線程(thread)?
thread的執行是可以由調度程序獨立管理的最小程序指令序列,調度程序通常是操作系統的一部分。大多數情況下,一個線程存在于進程中,而多個線程可以存在于單個進程中,因此是多線程的。
當計算機科學家看到Thread(線程)時就像化學家看到Atom(原子)一樣。
這些threads同時運行,并且共享資源。threads在操作系統的實現和進程在操作系統之間有所不同,但是在大多數情況下,線程是進程的組成部分。
什么是進程(process)?
進程是通常彼此獨立運行的程序的實例。例如,如果啟動Java程序,則操作系統會產生一個新程序,該程序process(進程)可與其他程序并行運行。在這些進程中,我們可以利用線程并發執行代碼,因此我們可以充分利用CPU的可用內核。
與線程不同,進程不會彼此共享資源。process(進程)是資源的單位,而thread(線程)是調度和執行的單位。
線程池
創建一個全新的OS線程需要內存分配和CPU指令,以便對其進行設置和銷毀。為了更好地處理線程的使用并避免創建新線程,操作系統或平臺考慮了一項Thread Pool(線程池)功能,該功能使應用程序可以使用已經存在的線程。
這是處理多個線程而不處理其創建或銷毀的更有效的方法。此外,操作系統知道何時未積極使用線程池中的線程,因此它們可以在線程迭代期間自動“跳過”它。
線程的描述性編程表示
我們將研究從JavaExecutors和Java中的兩個類實現的線程Runnable。
執行程序Executors是Java中的一類,抽象了大多數手動線程創建過程。它們能夠運行異步任務,通常可以管理線程池,因此我們不必手動創建新線程。
該類Executors提供了方便的工廠方法來創建各種執行程序服務。在下面的示例中,我們使用大小為1的線程池的執行程序。
結果看起來類似于上面的示例,但是在運行代碼時,您會注意到一個重要的區別,java進程永不停止!Executors必須明確停止-否則他們會繼續聽新任務。
ExecutorService提供了兩種方法用于此目的:shutdown()等待當前正在運行的任務完成,同時shutdownNow()中斷所有正在運行的任務,并立即關閉執行程序。此服務通常在使用套接字連接時使用,以促進異步調用(Sink-Source連接)。
可運行的 Runnable是定義單個空隙無參數方法功能接口run()。在開始新線程之前,您必須指定此線程要執行的代碼,通常稱為任務,這是通過實現來完成的Runnable。請注意,您可以擁有盡可能多的任務。
對于上面的示例,我們利用Java 8 lambda表達式將當前線程名稱打印到控制臺。首先,我們在開始新線程之前直接在主線程上執行runnable。請參見下面的示例輸出。
Hello main Hello Thread-0 Done!
或者這樣:
Hello main Done! Hello Thread-0
我們有兩個可能的輸出,因為由于并發執行,我們無法預測在打印之前還是之后將調用runnable。該順序是不確定的,因此使得并發編程在大型應用程序中成為一項復雜的任務。盡管線程也可以處于一定的睡眠時間。
深入多線程
就像我們前面已經明確指出的那樣,一個multi-threaded(多線程)程序包含兩個或多個可以同時運行的部分,并且每個部分可以同時處理不同的任務,特別是在計算機具有多個CPU時,可以最佳利用可用資源。
Multi-threading(多線程)將多任務處理的概念擴展到了應用程序中,您可以在其中將單個應用程序中的特定操作細分為各個線程。它使您可以編寫一種方式,使多個活動可以在同一程序中同時進行。
有幾種編程語言可以為騰出空間multi-threading,并且大多數語言是面向對象的編程語言(OOP)。語言,如Java,C,C++甚至.NET框架。其他一些解釋型語言也有所作為,例如Ruby MRIforRuby和CPythonfor Python。如果您等著看Javascript,那么您將不是因為JavaScript不支持多線程,而是因為JavaScript瀏覽器中的解釋器是一個單線程。
大量的多線程應用程序
幾乎所有構建良好的應用程序都支持多線程。讓我們看一下瀏覽器。大多數瀏覽器都是多線程的,從firefox到Safari到Chrome還有許多其他。但是今天我們要詳細討論Chrome。
Google Chrome
Chrome具有多進程架構,并且每個進程都是高度多線程的。主要目標是使主線程(瀏覽器進程中的“ UI”線程)和IO線程(用于處理IPC的每個進程的線程)保持響應。這意味著將任何阻塞的I / O或其他昂貴的操作卸載到其他線程。
在Chrome中,您打開的每個選項卡都有其自己的內容處理。五個標簽,5個進程,一百個標簽,100個進程。這種方法可最大程度地提高性能,但您會在內存消耗和電池壽命方面付出沉重的代價。有沒有想過為什么任務管理器上的Chrome的CPU消耗總是很高?好吧,你去。
每個 chrome 進程都有
main thread 此線程更新UI并運行大多數Blink。
IO thread 此線程句柄的IPC和網絡請求
還有一些special-purpose threads
一池的general-purpose threads
Chrome與Firefox的比較
雖然Chrome會為每個選項卡創建一個內容處理Firefox,但默認情況下最多旋轉四個內容處理線程。在Firefox中,前4個標簽分別使用這4個進程,其他標簽則使用這些進程中的線程。一個進程中的多個選項卡共享內存中已經存在的瀏覽器引擎,而不是每個選項卡都創建自己的瀏覽器。
線程與進程
線程在許多方面與傳統的多任務處理過程不同:
進程通常是獨立的,而線程作為進程的子集存在。
進程比線程攜帶更多的狀態信息,而一個進程中的多個線程共享進程狀態以及內存和其他資源。
進程具有單獨的地址空間,而線程共享它們的地址空間。
進程僅通過系統提供的進程間通信機制進行交互。
同一進程中線程之間的上下文切換通常比進程之間的上下文切換發生得更快。
平行性
并行性與工作分散在多個單元中的概念有關,以這種方式不會損害最終產品,但會減少總執行時間。
并行執行是兩個(或多個)任務同時運行的能力。雖然并發代表了可能性,但并行是現實。
總結
現在,多線程已成為現代軟件開發的重要組成部分。它受到許多編程語言和平臺的支持,并一直延伸到操作系統。知道如何使用多個線程可以肯定會導致開發人員構建更好的應用程序。
任務調度 多線程
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。