Python線程池知多少

目錄

目標

Python版本

官方文檔

概述

線程池

實戰

創建線程池的基本語法

批量提交任務

生產者&消費者模型


目標

????????掌握線程池的基本概念和使用方法。


Python版本

? ? ? ? Python 3.9.18


官方文檔

concurrent.futures — Launching parallel taskshttps://docs.python.org/3.9/library/concurrent.futures.html


概述

線程池

????????線程的創建和銷毀是需要消耗資源的,比如:CPU資源、內存、上下文切換等。線程池使得線程被創建后不停地被復用,大概過程是:

  1. 程序啟動后線程池會預先創建一些線程,并將這些線程放入線程池中,這些線程是閑置著的,隨時準備執行任務。
  2. 當需要任務執行時,程序會向線程池提交任務,線程池會取出一個空閑的線程來執行任務。
  3. 任務執行完成后線程不會被銷毀,而是再次放回到線程池中,等待下一個任務。

我們創建線程池可以指定最大線程數量,也可以不指定。官方文檔對于默認線程數量做了描述:

if max_workers is None:?
# ThreadPoolExecutor is often used to:?
# * CPU bound task which releases GIL?
# * I/O bound task (which releases GIL, of course)?
#?
# We use cpu_count + 4 for both types of tasks.?
# But we limit it to 32 to avoid consuming surprisingly large resource?
# on many core machine. max_workers = min(32, (os.cpu_count() or 1) + 4)

即默認設置的最大線程數量是:

  1. 操作系統核心數量+4,
  2. 如果獲取不到操作系統核心數量則最大線程數量是1個。
  3. 默認不超過32個線程數量。

實戰

創建線程池的基本語法

import random
import time
from concurrent.futures import ThreadPoolExecutordef fun(url):time.sleep(random.randint(1,3))# 獲取當前時間戳current_time = time.localtime()# 格式化時間為yyyy-MM-dd HH:mm:ssformatted_time = time.strftime('%Y-%m-%d %H:%M:%S', current_time)return f"請求到了{url}的網絡數據:{formatted_time}"if __name__ == '__main__':executor = ThreadPoolExecutor(max_workers=4)task_1=executor.submit(fun, "www.baidu.com")task_2=executor.submit(fun, "www.bilibili.com")task_3=executor.submit(fun, "www.jd.com")task_4=executor.submit(fun, "www.taobao.com")task_5 = executor.submit(fun, "www.tianmao.com")task_1.done()task_2.done()task_3.done()task_4.done()task_5.done()result_1=task_1.result()result_2=task_2.result()result_3=task_3.result()result_4=task_4.result()result_5=task_5.result()print(result_1)print(result_2)print(result_3)print(result_4)print(result_5)print("主線程結束")

批量提交任務

需求

? ? ? ? 創建一個線程池,用來批量執行不同頁面的請求任務。

import random
import time
from concurrent.futures import ThreadPoolExecutor, as_completeddef get_page_html(page_num):time.sleep(random.randint(1,5))# 獲取當前時間戳current_time = time.localtime()# 格式化時間為yyyy-MM-dd HH:mm:ssformatted_time = time.strftime('%Y-%m-%d %H:%M:%S', current_time)return f"請求到第{page_num}頁數據:{formatted_time}"if __name__ == '__main__':executor=ThreadPoolExecutor()#請求第一頁至第一百頁的數據。page_num_list=[page_num for page_num in range(1,101)]task_list = [executor.submit(get_page_html,page_num) for page_num in page_num_list]#按照task_list元素的順序返回結果,即使后面的頁面數據提前請求到了數據,也會靠后返回。for task in task_list:print("按照task_list中的元素順序返回數據:",task.result())#按照先執行完,先返回結果。for future in as_completed(task_list):print("按照先請求到數據就先返回數據:",future.result())print("主線程結束")

生產者&消費者模型

需求

????????每次生產出一只烤鴨,就會被等待的消費者消費,最多生產100000只烤鴨。要求用線程池實現。

import queue
import threading
import time
from concurrent.futures import ThreadPoolExecutor# 最多生產烤鴨數量
max_duck_count = 100000
# 當前生產的烤鴨數量
duck_count = 0
# 把生產的烤鴨放入隊列中
duck_queue = queue.Queue()def produce_duck(duck_queue):global duck_count# 生產者不停地生產烤鴨while True:if duck_count >= max_duck_count:breakduck_count += 1duck_queue.put(duck_count)print(f"===========生產者{threading.current_thread().name}生產了{duck_count}只烤鴨。")# 所有生產者完成后放入退出信號duck_queue.put(None)def consume_duck(duck_queue):# 消費者不停地消費烤鴨while True:duck = duck_queue.get()if duck is None:# 收到退出信號后,消費者退出duck_queue.put(None)  # 傳遞退出信號給其他消費者breakprint(f"——————————消費者{threading.current_thread().name}消費了{duck}只烤鴨。")# 初始化線程,設置名稱
def init_thread():thread_id = threading.get_ident()threading.current_thread().name = f"線程_{thread_id}"if __name__ == '__main__':thread_pool = ThreadPoolExecutor(max_workers=10,initializer=init_thread)# 啟動多個生產者線程for i in range(5):thread_pool.submit(produce_duck, duck_queue)# 啟動多個消費者線程for i in range(8):thread_pool.submit(consume_duck, duck_queue)# 等待線程池中的任務執行完畢thread_pool.shutdown(wait=True)print("主線程結束。")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72186.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72186.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72186.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(轉)SpringBoot和SpringCloud的區別

(轉)SpringBoot和SpringCloud的區別:

中科大 計算機網絡組成原理 1.4 接入網和物理媒體 筆記

一、接入網核心功能與架構 ?核心作用? 接入網是連接用戶終端與核心網絡的橋梁,承擔用戶身份認證、帶寬分配、數據加密等功能,直接影響網絡服務的可靠性和用戶體驗。例如,杭州電視臺的數字人主播通過光纖專線實現零失誤新聞播報,…

阿里云音頻算法崗內推

1、視頻云直播、連麥,點播,短視頻,媒體生產與處理等服務相關的實時/非實時的音頻分析和處理; 2、音頻處理算法,包括多場景降噪、自動增益控制、回聲消除等; 3、音頻特效算法研發,包括變調變速…

如何使用DeepSeek輔助準備面試

前言 又到了金三銀四的時間點了。每年的這個時間點都會出現無數的機遇和機會,但是如何準備面試,應該準備哪些面試題,如何查漏補缺我們的技術面的短板,這是我們每次準備面試的時候,都會遇見的問題。在今年,…

如何流暢訪問github

1.傳輸數據原理 本地計算機通過本地網接入運營骨干網,經過DNS域名解析,將輸入的字符解析為要連接的真實IP地址,服務器返還一個數據包(github)給計算機 2.原因 DNS域名污染-DNS解析出現問題,導致訪問一個不存在的服務器 3.解決…

JPA屬性轉換器的使用與實例解析

在Java持久化框架中,JPA(Java Persistence API)為我們提供了強大的功能來操作數據庫。其中,屬性轉換器(Attribute Converter)是一個非常實用的特性,它允許我們將實體類中的屬性類型轉換為適合存…

AI數據分析:用DeepSeek做數據清洗

在當今數據驅動的時代,數據分析已成為企業和個人決策的重要工具。隨著人工智能技術的快速發展,AI 驅動的數據分析工具正在改變我們處理和分析數據的方式。本文將著重介紹如何使用 DeepSeek 進行數據清洗。 數據清洗是數據分析的基礎,其目的是…

rust學習~tokio的io

await Suspend execution until the result of a Future is ready. 暫停執行,直到一個 Future 的結果就緒。 .awaiting a future will suspend the current function’s execution until the executor has run the future to completion. 對一個 Future 使用 .awa…

騰訊2025年軟件測試面試題

以下是基于騰訊等一線互聯網公司軟件測試崗位的面試趨勢和技術要求,025年出現的軟件測試面試題。這些問題涵蓋了基礎知識、自動化測試、性能測試、安全測試、編程能力等多個方面,供參考和準備。 一、基礎知識 軟件測試的基本概念

數據結構(陳越,何欽銘) 第四講 樹(中)

4.1 二叉搜索樹 4.1.1 二叉搜索樹及查找 Position Find(ElementTyoe X,BinTree BST){if(!BST){return NULL;}if(X>BST->Data){return Find(X,BST->Right)}else if(X<BST->Data){return Find(X,BST->Left)}else{return BST;} } Position IterFind(ElementTyp…

GEE學習筆記 28:基于Google Earth Engine的Landsat8纓帽變換土壤指數反演——亮度、綠度與濕度分量的提取

1.纓帽變換介紹 纓帽變換(Tasseled Cap Transformation,TCT),也稱為纓帽特征空間或纓帽系數,是一種用于遙感圖像分析的線性變換方法。它最初由美國農業部的研究人員E. Kauth和G. Thomas在1976年提出,用于增強陸地衛星(Landsat)圖像中的特定地表特征,如植被、土壤和城市…

【現代Web布局與動畫技術:卡片組件實戰分享】

&#x1f4f1; 現代Web布局與動畫技術&#xff1a;卡片組件實戰分享 &#x1f680; 引言 &#x1f31f; 在過去的開發過程中&#xff0c;我們共同實現了一個功能豐富的卡片組件&#xff0c;它不僅美觀&#xff0c;還具有交互性和響應式設計。這篇文章將分享這個組件背后的技術…

學習路之PHP --TP6異步執行功能 (無需安裝任何框架)

學習路之PHP --異步執行功能 &#xff08;無需安裝任何框架&#xff09; 簡介一、工具類二、調用三、異步任務的操作四、效果&#xff1a; 簡介 執行異步任務是一種很常見的需求&#xff0c;如批量發郵箱&#xff0c;短信等等執行耗時任務時&#xff0c;需要程序異步執行&…

STM32之影子寄存器

預分頻寄存器計數到一半的時候&#xff0c;改變預分頻值&#xff0c;此時不會立即生效&#xff0c;會等到計數完成&#xff0c;再從影子寄存器即預分頻緩沖器里裝載修改的預分頻值。 如上圖&#xff0c;第一行是內部時鐘72M&#xff0c;第二行是時鐘使能&#xff0c;高電平啟動…

Deepseek API接入IDE【VSCode Cline Cursor ChatBox Deepseek deepseek-reasoner】

本文解決以下疑難雜癥: 使用deepseek的最新接模型接入ide 使用deepseek的最新接模型接入vscode 使用deepseek的最新接模型接入vscode中的Cline 使用deepseek的最新接模型接入Cline 使用deepseek的最新接模型接入ChatBox 使用cursor接入Deepseek官方的的deepseek-reasoner…

微信小程序讀取寫入NFC文本,以及NFC直接啟動小程序指定頁面

一、微信小程序讀取NFC文本(yyy優譯小程序實現),網上有很多通過wx.getNFCAdapter方法來監聽讀取NFC卡信息,但怎么處理讀取的message文本比較難找,現用下面方法來實現,同時還解決幾個問題,1、在回調方法中this.setData不更新信息,因為this的指向問題,2、在退出頁面時,…

在Linux桌面上創建Idea啟動快捷方式

1、在桌面新建idea.desktop vim idea.desktop [Desktop Entry] EncodingUTF-8 NameIntelliJ IDEA CommentIntelliJ IDEA Exec/home/software/idea-2021/bin/idea.sh Icon/home/software/idea-2021/bin/idea.svg Terminalfalse TypeApplication CategoriesApplication;Developm…

VUE2生命周期頁面加載順序

使用 Vue CLI 4.5 運行 vue create myvue 創建項目&#xff0c;并通過 npm run serve 運行后&#xff0c;會生成一個標準的 Vue 項目目錄結構。以下是生成目錄的詳細說明&#xff0c;以及運行 localhost:8080 后 Vue 頁面的加載順序。 1. 生成目錄結構 運行 vue create myvue …

SV基礎(一):System Verilog與Verilog核心區別詳解

文章目錄 **1. 設計增強功能****數據類型擴展****接口(Interface)****2. 驗證功能增強****斷言(Assertions)****約束隨機測試****功能覆蓋率****3. 面向對象編程(OOP)****4. 測試平臺(Testbench)改進****5. 語法簡化****6. 其他關鍵區別****學習建議**System Verilog 是…

如何用 Python 進行機器學習

文章目錄 前言1. 環境準備Python安裝選擇Python開發環境安裝必要庫 2. 數據收集與加載3. 數據探索與可視化4. 數據預處理5. 模型選擇與訓練6. 模型評估7. 模型調優8. 模型部署 前言 使用 Python 進行機器學習一般可以按照以下步驟進行&#xff0c;下面將詳細介紹每個步驟及對應…