day 34線程的其他方法,線程池

来源:https://www.cnblogs.com/yanghongtao/archive/2019/01/14/10268717.html
-Advertisement-
Play Games

線程的其他方法: from threading import Thread,current_thread: currrent_thread().getName() 獲取線程的名稱 current_thread().ident 獲取到線程的id current_thread() 當前線程的信息 imp ...


線程的其他方法:  from threading import Thread,current_thread: currrent_thread().getName()  獲取線程的名稱 current_thread().ident   獲取到線程的id current_thread()  當前線程的信息 import threading  #導入threading模塊才能使用下麵的功能: threading.enumerate()  當前正在運行線程對象的列表 threading.active_count()   活動的線程   import time import threading from threading import  Thread,current_thread   def f1(n):     time.sleep(1)     print('子線程名稱',current_thread().getName())     print('%s號線程任務' %n)     if __name__ == '__main__':     t1 =Thread(target=f1,args=(1,))     t1.start()     print('主線程名稱',current_thread().getName())  ###MainThread     print('主線程ID',current_thread().ident)     ##2260     print(current_thread())   #當前線程<_MainThread(MainThread, started 2260)>     print(threading.enumerate())   #[<_MainThread(MainThread, started 2260)>, <Thread(Thread-1, started 2520)>]  當前正在運行線程對象的列表     print(threading.active_count())  # 活動的線程  #2 線程池(重點)  from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor p =ThreadPoolExecutor()  預設的線程個數是cpu個數 *5 p = ProcessPoolExecutor()  預設的進程個數是cup個數(核數) p.map(f1, 可迭代的對象)  非同步執行 def f1(n1,n2):       print(n1,n2)  p.submit(f1,11,12)  res=p.submit(f1,11,12) 非同步提交任務,裡面無敵傳參,但是形參位置必須對應實參接收 res.result()  和get 方法一樣,如果沒有結果,會等待,阻塞程式   shutdown() close+join鎖定線程池,等待線程池中所有已經提交的任務全部執行完畢 import time from threading import current_thread from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor     def f1(n,s):     time.sleep(1)     # print('%s號子線程' %current_thread().ident)     # print(n,s)     return (n,s)     if __name__ == '__main__':     tp =ThreadPoolExecutor(4)     # tp = ProcessPoolExecutor(4)     # tp.map(f1,range(10))  #非同步提交任務,參數同樣是任務名稱,可迭代對象       res_list = []     for i in range(10):         res = tp.submit(f1,i,'藤椒')  #submit是給線程池非同步提交任務         print(res)         #res.result()         res_list.append(res)       # for r in res_list:     #     print(r.result())       tp.shutdown()  #主線程等待所有提交給線程池的任務,全部執行完畢 close+join     for r in res_list:         print(r.result())     print('主線程結束')       隊列(重點) 先進先出 queue.Queue()  先進先出隊列 q.qsize()  當前內容的長度 q.full() 查看隊列是否滿了 q.empty()  查看隊列是否空了 q.put_nowait()   放入不等待,程式往下執行 q.get_nowait()  獲取不等待,程式往下執行 import queue     #先進先出隊列 q =queue.Queue(3) q.put(1) q.put(2) print('當前隊列內容長度',q.qsize()) q.put(3) print('查看隊列是否滿了',q.full())   try:     q.put_nowait(4)  #報錯queue.Full except Exception:     print('隊列滿了')   print(q.get()) print(q.get()) print('查看隊列是否為空',q.empty()) print(q.get()) print('查看隊列是否為空',q.empty())   try:     q.get_nowait()   #queue.Empty except Exception:     print('隊列空了') 先進後出,或者後進先出,類似於棧fifo: first in first out queue.LifoQueue()  先進後出\後進先出隊列 import queue   q = queue.LifoQueue(3)   q.put(1) q.put(2) q.put(3)   print(q.get()) print(q.get()) print(q.get()) 優先隊列: queue.PriorityQueue() put的數據是一個元組,元組的第一個參數是優先順序數字,數字越下,優先順序越高,越先被get到被去出來,第二個參數是put進去的值,吐過說優先順序相同,那麼直別忘了應該是相同的數據類型,字典不行     如果優先順序數字相同,會比較第二個參數的元素的ascii表中的位置,如果數據類型不同會報錯.     如果說值裡面的元素是數字類型,那麼兩個值的優先順序相同時,比較的是兩個值得大小,小的優先被去出來. import queue   q = queue.PriorityQueue(5) # q.put((5,'alex')) # q.put((2,'寶寶')) # q.put((7,'大力'))   # q.put((5,(2,3))) q.put((5,(2,3)))  #如果說值裡面的元素是數字類型,那麼當兩個值的優先順序相同時,比較的是兩個值的大小,小的優先被取出來 #如果元素是字元串,那麼依次比較每個字母的ascii表中的位置,小的優先被取出來 # q.put((2,{'x':3})) # q.put((5,(1,2))) q.put((5,(2,2,3))) # q.put((2,'zalex')) # q.put((-1,'yubing')) # q.put((2,{'k':666})) #如果優先順序數字相同,如果數據類型不同會報錯 # q.put((2,('a','b'))) # q.put((1,(1,2))) # q.put((3,(1,2))) # q.put((-10,(1,2))) print(q.get()) 協程:輕量型線程.  生成器,Greenlet模塊,Gevent模塊(重點) 協程:一個線程裡面實現任務的併發:變成生成器(記錄狀態),實現兩個程式的來回切換,實現併發 生成器版協程: import time   def f1():     for i in range(10):         time.sleep(0.5)         print('f1>>',i)         yield   def f2():     g = f1()     for i in range(10):         time.sleep(0.5)         print('f2>>', i)         next(g)   f1() f2() Greenlet模塊 如果導入模塊報錯,是沒有載入第三方的模塊,首先:在py解釋器上找到Terminal輸入:pip install greenlet,如果提示不是內部命令,找到python安裝的位置的路徑,Scripts文件裡面的pip,選擇路徑,添加到環境變數裡面(我的電腦--屬性--高級系統設置--環境變數--Path新建添加),在使用管理員命令輸入pip install greenlet,最後重啟解釋器就完成啦,可以開心的使用. import time import greenlet from greenlet import greenlet   def f1(s):     print('第一次f1'+s)     g2.switch('taibai')     time.sleep(1)     print('第二次f1' + s)     g2.switch() def f2(s):     print('第一次f2' + s)     g1.switch()     time.sleep(1)     print('第二次f2' + s)   g1 = greenlet(f1) g2 = greenlet(f2) g1.switch('alex') Gevent模塊(重點) import gevent from gevent import monkey;monkey.patch_all() import time import threading   def f1():     print('第一次f1')     # print(threading.current_thread().getName())     # gevent.sleep(1)     time.sleep(2)     print('第二次f1')   def f2():     # print(threading.current_thread().getName())     print('第一次f2')     # gevent.sleep(2)     time.sleep(2)     print('第二次f2')   s = time.time() g1 = gevent.spawn(f1) #非同步提交了f1任務 g2 = gevent.spawn(f2) #非同步提交了f2任務 # g1.join() # g2.join() gevent.joinall([g1,g2]) e = time.time() print('執行時間:',e-s) print('主程式任務') 線程池的回調函數 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor   def f1(n,s):     return n+s   def f2(n):       print('回調函數>>>',n.result()) if __name__ == '__main__':       tp = ThreadPoolExecutor(4)       res = tp.submit(f1,11,12).add_done_callback(f2)       # print(res.result())  

 

  線程的其他方法:  from threading import Thread,current_thread: currrent_thread().getName()  獲取線程的名稱 current_thread().ident   獲取到線程的id current_thread()  當前線程的信息 import threading  #導入threading模塊才能使用下麵的功能: threading.enumerate()  當前正在運行線程對象的列表 threading.active_count()   活動的線程   import time import threading from threading import  Thread,current_thread   def f1(n):     time.sleep(1)     print('子線程名稱',current_thread().getName())     print('%s號線程任務' %n)     if __name__ == '__main__':     t1 =Thread(target=f1,args=(1,))     t1.start()     print('主線程名稱',current_thread().getName())  ###MainThread     print('主線程ID',current_thread().ident)     ##2260     print(current_thread())   #當前線程<_MainThread(MainThread, started 2260)>     print(threading.enumerate())   #[<_MainThread(MainThread, started 2260)>, <Thread(Thread-1, started 2520)>]  當前正在運行線程對象的列表     print(threading.active_count())  # 活動的線程  #2 線程池(重點)  from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor p =ThreadPoolExecutor()  預設的線程個數是cpu個數 *5 p = ProcessPoolExecutor()  預設的進程個數是cup個數(核數) p.map(f1, 可迭代的對象)  非同步執行 def f1(n1,n2):       print(n1,n2)  p.submit(f1,11,12)  res=p.submit(f1,11,12) 非同步提交任務,裡面無敵傳參,但是形參位置必須對應實參接收 res.result()  和get 方法一樣,如果沒有結果,會等待,阻塞程式   shutdown() close+join鎖定線程池,等待線程池中所有已經提交的任務全部執行完畢 import time from threading import current_thread from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor     def f1(n,s):     time.sleep(1)     # print('%s號子線程' %current_thread().ident)     # print(n,s)     return (n,s)     if __name__ == '__main__':     tp =ThreadPoolExecutor(4)     # tp = ProcessPoolExecutor(4)     # tp.map(f1,range(10))  #非同步提交任務,參數同樣是任務名稱,可迭代對象       res_list = []     for i in range(10):         res = tp.submit(f1,i,'藤椒')  #submit是給線程池非同步提交任務         print(res)         #res.result()         res_list.append(res)       # for r in res_list:     #     print(r.result())       tp.shutdown()  #主線程等待所有提交給線程池的任務,全部執行完畢 close+join     for r in res_list:         print(r.result())     print('主線程結束')       隊列(重點) 先進先出 queue.Queue()  先進先出隊列 q.qsize()  當前內容的長度 q.full() 查看隊列是否滿了 q.empty()  查看隊列是否空了 q.put_nowait()   放入不等待,程式往下執行 q.get_nowait()  獲取不等待,程式往下執行 import queue     #先進先出隊列 q =queue.Queue(3) q.put(1) q.put(2) print('當前隊列內容長度',q.qsize()) q.put(3) print('查看隊列是否滿了',q.full())   try:     q.put_nowait(4)  #報錯queue.Full except Exception:     print('隊列滿了')   print(q.get()) print(q.get()) print('查看隊列是否為空',q.empty()) print(q.get()) print('查看隊列是否為空',q.empty())   try:     q.get_nowait()   #queue.Empty except Exception:     print('隊列空了') 先進後出,或者後進先出,類似於棧fifo: first in first out queue.LifoQueue()  先進後出\後進先出隊列 import queue   q = queue.LifoQueue(3)   q.put(1) q.put(2) q.put(3)   print(q.get()) print(q.get()) print(q.get()) 優先隊列: queue.PriorityQueue() put的數據是一個元組,元組的第一個參數是優先順序數字,數字越下,優先順序越高,越先被get到被去出來,第二個參數是put進去的值,吐過說優先順序相同,那麼直別忘了應該是相同的數據類型,字典不行     如果優先順序數字相同,會比較第二個參數的元素的ascii表中的位置,如果數據類型不同會報錯.     如果說值裡面的元素是數字類型,那麼兩個值的優先順序相同時,比較的是兩個值得大小,小的優先被去出來. import queue   q = queue.PriorityQueue(5) # q.put((5,'alex')) # q.put((2,'寶寶')) # q.put((7,'大力'))   # q.put((5,(2,3))) q.put((5,(2,3)))  #如果說值裡面的元素是數字類型,那麼當兩個值的優先順序相同時,比較的是兩個值的大小,小的優先被取出來 #如果元素是字元串,那麼依次比較每個字母的ascii表中的位置,小的優先被取出來 # q.put((2,{'x':3})) # q.put((5,(1,2))) q.put((5,(2,2,3))) # q.put((2,'zalex')) # q.put((-1,'yubing')) # q.put((2,{'k':666})) #如果優先順序數字相同,如果數據類型不同會報錯 # q.put((2,('a','b'))) # q.put((1,(1,2))) # q.put((3,(1,2))) # q.put((-10,(1,2))) print(q.get()) 協程:輕量型線程.  生成器,Greenlet模塊,Gevent模塊(重點) 協程:一個線程裡面實現任務的併發:變成生成器(記錄狀態),實現兩個程式的來回切換,實現併發 生成器版協程: import time   def f1():     for i in range(10):         time.sleep(0.5)         print('f1>>',i)         yield   def f2():     g = f1()     for i in range(10):         time.sleep(0.5)         print('f2>>', i)         next(g)   f1() f2() Greenlet模塊 如果導入模塊報錯,是沒有載入第三方的模塊,首先:在py解釋器上找到Terminal輸入:pip install greenlet,如果提示不是內部命令,找到python安裝的位置的路徑,Scripts文件裡面的pip,選擇路徑,添加到環境變數裡面(我的電腦--屬性--高級系統設置--環境變數--Path新建添加),在使用管理員命令輸入pip install greenlet,最後重啟解釋器就完成啦,可以開心的使用. import time import greenlet from greenlet import greenlet   def f1(s):     print('第一次f1'+s)     g2.switch('taibai')     time.sleep(1)     print('第二次f1' + s)     g2.switch() def f2(s):     print('第一次f2' + s)     g1.switch()     time.sleep(1)     print('第二次f2' + s)   g1 = greenlet(f1) g2 = greenlet(f2) g1.switch('alex') Gevent模塊(重點) import gevent from gevent import monkey;monkey.patch_all() import time import threading   def f1():     print('第一次f1')     # print(threading.current_thread().getName())     # gevent.sleep(1)     time.sleep(2)     print('第二次f1')   def f2():     # print(threading.current_thread().getName())     print('第一次f2')     # gevent.sleep(2)     time.sleep(2)     print('第二次f2')   s = time.time() g1 = gevent.spawn(f1) #非同步提交了f1任務 g2 = gevent.spawn(f2) #非同步提交了f2任務 # g1.join() # g2.join() gevent.joinall([g1,g2]) e = time.time() print('執行時間:',e-s) print('主程式任務') 線程池的回調函數 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor   def f1(n,s):     return n+s   def f2(n):       print('回調函數>>>',n.result()) if __name__ == '__main__':       tp = ThreadPoolExecutor(4)       res = tp.submit(f1,11,12).add_done_callback(f2)       # print(res.result())    
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近再看I/O這一塊,故作為總結記錄於此。JDK1.4引入NIO後,原來的I/O方法都基於NIO進行了優化,提高了性能。I/O操作類都在java.io下,大概將近80個,大致可以分為4類: 基於位元組操作的I/O介面:以InputStream和OutputStream為基類,也是I/O操作的基礎。 基 ...
  • 將能夠處理同一類請求的對象形成一條鏈,所提交的請求沿著鏈傳遞,鏈上的對象逐個判斷是否有能力處理該請求 如果能則處理,否則傳遞給下一個對象。 例如:公司行政審批流程,鬥地主游戲,田徑項目中接力運動等。都是責任鏈模式 的運用。 責任鏈可能是一條直線,一個環鏈或者是一個樹結構的一部分。 責任鏈涉及角色: ...
  • 一、下載maven Apache Maven下載地址:http://maven.apache.org/download.cgi 二、maven的安裝 將下載好的安裝文件解壓到d盤根目錄下即可(當然,這裡放別的目錄也行,但是最好不要出現中文.): 三、配置maven的環境變數 第一步:新建一個MAVE ...
  • 1.Window-Preferences-Server-Runtime Environments 2.點擊Add,選擇相應的Tomcat版本,我的是7.0的所以我選擇這個。並勾選Create a new local server,點擊next 3.點擊Browse,選擇Tomcat的本地安裝路徑,並 ...
  • jdk8 Stream map 取對象中某項的值 map 取對象中某項的值 問題 ... List<ScreenWiperResponse> screenWiperList= screenWiperResponseList.stream().map(CarAdapterForScreenWiperR ...
  • Django 系列博客(十) 前言 本篇博客介紹在 Django 中如何對資料庫進行增刪查改,主要為對單表進行操作。 ORM簡介 查詢數據層次圖解:如果操作 mysql,ORM 是在 pymysql 之上又進行了一層封裝。 MVC 或者 MTV 框架中包括一個重要的部分,就是 ORM,它實現了數據模 ...
  • 1. 線程的其他方法 2. 線程隊列 線程隊列中三種隊列形式,所使用的方法相同,都有put(),get(),put_nowait(),get_nowait(),qsize(),full(),empty() 等這些方法.就只傳一組先進先出的代碼 import queue 先進先出隊列:queue.Qu ...
  • php連接資料庫,以及日期處理函數 $conn=mysql_connect("10.0.10.0:0000","root","123456") or die("資料庫連接失敗").mysql_error(); mysql_select_db("database"); $querry1 = "SELE ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...