Python 線程

来源:https://www.cnblogs.com/hades0607/archive/2018/09/06/9601310.html
-Advertisement-
Play Games

線程 線程指的就是代碼的執行過程 進程其實是一個資源單位,而進程內的線程才是CPU上的執行單位 在傳統操作系統中,每個進程有一個地址空間,而且預設就有一個控制線程 線程顧名思義,就是一條流水線工作的過程,一條流水線必須屬於一個車間,一個車間的工作過程是一個進程 車間負責把資源整合到一起,是一個資源單 ...


線程

線程指的就是代碼的執行過程

進程其實是一個資源單位,而進程內的線程才是CPU上的執行單位

在傳統操作系統中,每個進程有一個地址空間,而且預設就有一個控制線程
線程顧名思義,就是一條流水線工作的過程,一條流水線必須屬於一個車間,一個車間的工作過程是一個進程

車間負責把資源整合到一起,是一個資源單位,而一個車間內至少有一個流水線
流水線的工作需要電源,電源就相當於CPU,所以進程只是用來把資源集中到一起(進程只是一個資源單位,或者說資源集合),而線程才是cpu上的執行單位。

多線程(即多個控制線程)的概念是:在一個進程中存在多個控制線程,多個控制線程共用該進程的地址空間,相當於一個車間內有多條流水線,都共用一個車間的資源。

例如:
北京地鐵與上海地鐵是不同的進程,而北京地鐵里的13號線是一個線程,北京地鐵所有的線路共用北京地鐵所有的資源,比如所有的乘客可以被所有線路拉。
線程詳解

 

線程和進程的區別

1.同一進程下的多個線程共用該進程內的資源

2.創建線程的開銷遠遠小於進程

創建線程的開銷遠遠小於進程
假設我們的軟體是一個工廠,該工廠有多條流水線,流水線工作需要電源,電源只有一個即CPU(單核CPU)
一個車間就是一個進程,一個車間至少一條流水線(一個進程至少一個線程)

創建一個進程,就是創建一個車間(申請空間,在該空間內建至少一條流水線)
而建線程,就只是在一個車間內造一條流水線,無需申請空間,所以創建開銷小

進程之間是競爭關係:
車間直接是競爭/搶電源的關係,競爭:不同的進程直接是競爭關係,是不同的程式員寫的程式運行的,迅雷搶占其他進程的網速,360把其他進程當做病毒乾死
線程之間是協作關係:
一個車間的不同流水線式協同工作的關係:同一個進程的線程之間是合作關係,不會自己乾自己
線程對比進程詳解

 

 

多線程舉例

開啟一個字處理軟體進程,該進程肯定需要辦不止一件事情,比如監聽鍵盤輸入,處理文字,定時自動將文字保存到硬碟,

這三個任務操作的都是同一塊數據,因而不能用多進程。只能在一個進程里併發地開啟三個線程,如果是單線程,那就只能是,

鍵盤輸入時,不能處理文字和自動保存,自動保存時又不能輸入和處理文字。

 

開啟線程的兩種方式

Thread實例對象的方法
  # isAlive(): 返回線程是否活動的。
  # getName(): 返回線程名。
  # setName(): 設置線程名。

threading模塊提供的一些方法:
  # threading.currentThread(): 返回當前的線程變數。
  # threading.enumerate(): 返回一個包含正在運行的線程的list。正在運行指線程啟動後、結束前,不包括啟動前和終止後的線程。
  # threading.activeCount(): 返回正在運行的線程數量,與len(threading.enumerate())有相同的結果。
 1 #方式一
 2 from threading import Thread
 3 import time
 4 def sayhi(name):
 5     time.sleep(2)
 6     print('%s say hello' %name)
 7 
 8 if __name__ == '__main__':
 9     t=Thread(target=sayhi,args=('egon',))
10     t.start()
11     print('主線程')
方式一
 1 #方式二
 2 from threading import Thread
 3 import time
 4 class Sayhi(Thread):
 5     def __init__(self,name):
 6         super().__init__()
 7         self.name=name
 8     def run(self):
 9         time.sleep(2)
10         print('%s say hello' % self.name)
11 
12 
13 if __name__ == '__main__':
14     t = Sayhi('egon')
15     t.start()
16     print('主線程')
方式二

 

 

 

 統一進程下線程間資源共用

 統一進程下的多個線程共用該進程內的資源

代碼舉例:

 1 from threading import Thread
 2 
 3 n = 100
 4 
 5 
 6 def task():
 7     global n
 8     n = 0
 9 
10 
11 if __name__ == '__main__':
12     t = Thread(target=task)
13     t.start()
14     t.join()
15     print(n)

 

 守護線程

無論是進程還是線程,都遵循:守護xxx會等待xxx運行完畢後被銷毀

需要強調的是:運行完畢並非終止運行 

#1.對主進程來說,運行完畢指的是主進程代碼運行完畢

#2.對主線程來說,運行完畢指的是主線程所在的進程內所有非守護線程統統運行完畢,主線程才算運行完畢

 

詳細解釋:

#1 主進程在其代碼結束後就已經算運行完畢了(守護進程在此時就被回收),然後主進程會一直等非守護的子進程都運行完畢後回收子進程的資源(否則會產生僵屍進程),才會結束,

#2 主線程在其他非守護線程運行完畢後才算運行完畢(守護線程在此時就被回收)。因為主線程的結束意味著進程的結束,進程整體的資源都將被回收,而進程必須保證非守護線程都運行完畢後才能結束。
 1 from threading import Thread
 2 import time
 3 def sayhi(name):
 4     time.sleep(2)
 5     print('%s say hello' %name)
 6 
 7 if __name__ == '__main__':
 8     t=Thread(target=sayhi,args=('egon',))
 9     t.setDaemon(True) #必須在t.start()之前設置
10     t.start()
11 
12     print('主線程')
13     print(t.is_alive())
14     '''
15     主線程
16     True
17     '''
 1 from threading import Thread
 2 import time
 3 def foo():
 4     print(123)
 5     time.sleep(1)
 6     print("end123")
 7 
 8 def bar():
 9     print(456)
10     time.sleep(3)
11     print("end456")
12 
13 
14 t1=Thread(target=foo)
15 t2=Thread(target=bar)
16 
17 t1.daemon=True
18 t1.start()
19 t2.start()
20 print("main-------")
迷惑人的例子

 

互斥鎖

 1 from threading import Thread,Lock
 2 import time
 3 
 4 mutex=Lock()  # 線程是共用資源的,所以不需要把鎖當參數傳
 5 n=100
 6 def task():
 7     global n
 8     mutex.acquire()
 9     temp=n
10     time.sleep(0.1)
11     n=temp-1
12     mutex.release()
13 
14 if __name__ == '__main__':
15     t_l=[]
16     for i in range(100):
17         t=Thread(target=task)
18         t_l.append(t)
19         t.start()
20 
21     for t in t_l:
22         t.join()
23     print(n)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • typeHandler作用: 1.傳參時將javaType類型轉換成jdbcType 2.結果集中ResultSet中取值時,jdbcType轉換為javaType; 系統自定義的typeHandler: mybatis系統內部定義了一系列的typeHandler;基本涵蓋了我們正常使用的類型轉換; ...
  • laravel的啟動需要通過路由、中間件、控制器、模型、視圖最後出現在瀏覽器。而路由、中間件、模型,這些功能都有自己的類,比如Route::any()、DB::table()、$this->middleware()等等,這些功能都是由一個叫IOC(服務容器)的對象來調配的。 它就像框架里的一個管家, ...
  • 昨天對springboot中的mybatis逆向工程與分頁應用進行了整理,今天對ssm項目中的逆向工程與分頁進行整理。 項目運行環境:eclipse+jdk1.8+maven+tomcat 搭建ssm項目 首先新建maven project,項目Archetype選擇:maven archetype ...
  • 對於職位管理,我們可以理解它為角色許可權的管理,就像前面所說的一樣,有了職位管理,後臺管理系統綁定好對應的許可權以後,新進員工、離職或崗位調整,管理員操作起來就非常的便捷了,只需要重新綁定對應職位就可以做好許可權的切換工作。 為了方便職位管理,我們可以將頁面設計成下麵這個樣子 左邊顯示部分列表,點擊其中一 ...
  • [異常描述] 方法1: 新建一個包,將預設包中的類文件拖入新建包中,刷新,預設包會消失 ...
  • DB數據源之SpringBoot+MyBatis踏坑過程(二)手工配置數據源與載入Mapper.xml掃描 原創文章,版權所有,未經允許進位轉載 吐槽之後應該有所改了,該方式可以作為一種過渡方式來使用。 1.環境說明 初次使用springboot,時間有限,需要迅速搭建好架構,沒有時間研究 使用sp ...
  • c/c++ 標準庫 string 標準庫 string的小例子 test1~test10 c++ include using namespace std; int main(void){ //test1 //string s1,s2; //cin s1 s2; //cout wd){ // cout ...
  • 本文使用簡單的面向過程的編程思想,更容易理解。 說明: 本文使用了簡單的模塊:requests和re模塊,當然也可以使用urlib模塊。 開發環境是:Python3.5 開發工具:VsCode 代碼如下: vscode結果如下圖所示: 本地文件如圖所示: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...