最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中多線程發(fā)送HTTP請求的三種方案對比

 更新時間:2026年06月12日 08:20:33   作者:detayun  
本文介紹了Python中多線程發(fā)送HTTP請求的三種主流方案對比,分別是threading+Queue,ThreadPoolExecutor和asyncio+aiohttp,文內還指出了常見陷阱,希望對大家有所幫助

為什么需要多線程?

單線程發(fā)送 100 個請求,每個 0.5 秒,總耗時 50 秒。多線程發(fā)送同樣 100 個請求,總耗時可能壓到 3~5 秒。

差距不是"快一點",是量級 difference。

但多線程不是銀彈。用錯了,比單線程還慢,還容易把對方服務打掛。

三種主流方案對比

方案適用場景上手難度性能上限
threading + Queue簡單批量任務??中等
concurrent.futures.ThreadPoolExecutor大多數(shù)場景首選?
asyncio + aiohttp高并發(fā)、IO密集????最高

結論先給:80% 的場景用 ThreadPoolExecutor 就夠了。

方案一:threading + Queue(手動控制)

適合需要精細控制線程數(shù)、任務隊列的場景。

import threading
import queue
import requests
import time

urls = [f"http://httpbin.org/delay/1?id={i}" for i in range(20)]
result_queue = queue.Queue()

def worker(q):
    while not q.empty():
        url = q.get()
        try:
            resp = requests.get(url, timeout=5)
            result_queue.put((url, resp.status_code))
        except Exception as e:
            result_queue.put((url, str(e)))
        finally:
            q.task_done()

# 啟動 5 個線程
threads = []
for _ in range(5):
    t = threading.Thread(target=worker, args=(queue.Queue(),))
    t.start()
    threads.append(t)

# 填入任務
task_queue = queue.Queue()
for url in urls:
    task_queue.put(url)

# 重新分配任務給 worker(簡化寫法,實際應把 task_queue 傳進去)
for t in threads:
    t.join()

while not result_queue.empty():
    print(result_queue.get())

問題:代碼啰嗦,手動管理線程生命周期,容易寫錯。

方案二:ThreadPoolExecutor(推薦)

Python 3.2+ 內置,幾行代碼搞定。

import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
import time

urls = [f"http://httpbin.org/delay/1?id={i}" for i in range(20)]

def fetch(url):
    try:
        resp = requests.get(url, timeout=5)
        return url, resp.status_code
    except Exception as e:
        return url, str(e)

t1 = time.time()

with ThreadPoolExecutor(max_workers=5) as executor:
    futures = {executor.submit(fetch, url): url for url in urls}
    
    for future in as_completed(futures):
        url, result = future.result()
        print(f"{url} -> {result}")

print(f"耗時:{time.time() - t1:.2f}s")

優(yōu)點

  • 自動管理線程池,不用手動 start/join
  • as_completed 按完成順序返回結果,不用等全部完成
  • max_workers 控制并發(fā)數(shù),防止把對方打掛

方案三:asyncio + aiohttp(高性能)

適合 上千級別并發(fā),或者你本身就在用異步框架(FastAPI、Sanic 等)。

import asyncio
import aiohttp
import time

urls = [f"http://httpbin.org/delay/1?id={i}" for i in range(20)]

async def fetch(session, url):
    try:
        async with session.get(url, timeout=5) as resp:
            return url, resp.status
    except Exception as e:
        return url, str(e)

async def main():
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        results = await asyncio.gather(*tasks)
        for url, result in results:
            print(f"{url} -> {result}")

t1 = time.time()
asyncio.run(main())
print(f"耗時:{time.time() - t1:.2f}s")

優(yōu)點:單線程實現(xiàn)高并發(fā),資源占用極低。

代價:學習曲線陡,所有調用鏈必須是 async 的,混用會出問題。

常見坑

1. max_workers 不是越大越好

workers = 100  # ? 大概率更慢,還可能被封 IP
workers = 10   # ? 大部分場景夠用

經驗值:10~20 是 sweet spot。超過 50 基本沒收益,還可能觸發(fā)對方限流。

2. 忘了設 timeout

requests.get(url)  # ? 對方不響應,你的線程就永遠掛著
requests.get(url, timeout=5)  # ? 5秒沒響應就放棄

3. 混用 Session 和多線程

requests.Session() 不是線程安全的。

session = requests.Session()  # ? 多線程共享同一個 session 會出問題

# 正確做法:每個線程自己創(chuàng)建 session
def fetch(url):
    with requests.Session() as s:  # ?
        return s.get(url).text

或者用 ThreadPoolExecutor 配合 requests 本身就沒問題,因為每個 submit 獨立執(zhí)行函數(shù),函數(shù)內自己創(chuàng)建 session。

4. 對方有反爬

多線程 = 高頻率訪問 = 容易觸發(fā)風控。

應對:

  • 加隨機延遲:time.sleep(random.uniform(0.5, 2))
  • 換 User-Agent 池
  • 用代理 IP 池

選型決策樹

請求量 < 100?
  → 單線程 + requests 就夠了,別過度設計

請求量 100~1000?
  → ThreadPoolExecutor(方案二)

請求量 > 1000 或已在用異步框架?
  → asyncio + aiohttp(方案三)

需要精細控制任務優(yōu)先級/重試/失敗隊列?
  → threading + Queue(方案一)或 Celery

一句話總結

多線程發(fā)送請求的核心不是"開更多線程",而是控制并發(fā)數(shù) + 復用連接 + 設置超時

ThreadPoolExecutor 解決了 80% 的問題,剩下 20% 才需要上 asyncio 或 Celery。

到此這篇關于Python中多線程發(fā)送HTTP請求的三種方案對比的文章就介紹到這了,更多相關Python多線程發(fā)送HTTP請求內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python tensorflow實現(xiàn)mnist手寫數(shù)字識別示例【非卷積與卷積實現(xiàn)】

    Python tensorflow實現(xiàn)mnist手寫數(shù)字識別示例【非卷積與卷積實現(xiàn)】

    這篇文章主要介紹了Python tensorflow實現(xiàn)mnist手寫數(shù)字識別,結合實例形式分析了基于tensorflow模塊使用非卷積與卷積算法實現(xiàn)手寫數(shù)字識別的具體操作技巧,需要的朋友可以參考下
    2019-12-12
  • Python的psutil模塊詳解

    Python的psutil模塊詳解

    psutil是一個跨平臺庫,能夠輕松實現(xiàn)獲取系統(tǒng)運行的進程和系統(tǒng)利用率(包括CPU、內存、磁盤、網絡等)信息,需要的朋友可以參考下
    2023-05-05
  • opencv python 圖像輪廓/檢測輪廓/繪制輪廓的方法

    opencv python 圖像輪廓/檢測輪廓/繪制輪廓的方法

    這篇文章主要介紹了opencv python 圖像輪廓/檢測輪廓/繪制輪廓的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • 正則表達式中單個字符的匹配方法教程

    正則表達式中單個字符的匹配方法教程

    正則表達式是用于匹配字符串模式的一種強大工具,它使用特定的語法來描述字符串的特征,如單個字符、字符集、重復次數(shù)等,這篇文章主要介紹了正則表達式中單個字符匹配的相關資料,需要的朋友可以參考下
    2025-12-12
  • 使用Python找出水仙花數(shù)的方法介紹

    使用Python找出水仙花數(shù)的方法介紹

    水仙花數(shù)也被稱為超完全數(shù)字不變數(shù)、自戀數(shù)、自冪數(shù)、阿姆斯壯數(shù)或阿姆斯特朗數(shù),水仙花數(shù)是指一個3位數(shù),本文就給大家簡單聊聊如何使用Python找出水仙花數(shù),感興趣的同學可以參考閱讀
    2023-07-07
  • Django Sitemap 站點地圖的實現(xiàn)方法

    Django Sitemap 站點地圖的實現(xiàn)方法

    這篇文章主要介紹了Django Sitemap 站點地圖的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 4種方法教你利用Python發(fā)現(xiàn)數(shù)據的規(guī)律

    4種方法教你利用Python發(fā)現(xiàn)數(shù)據的規(guī)律

    發(fā)現(xiàn)數(shù)據的規(guī)律是數(shù)據分析和數(shù)據科學中非常重要的一個步驟。這篇文章主要給大家整理了4個可以發(fā)現(xiàn)數(shù)據規(guī)律的方法,希望對大家有所幫助
    2023-03-03
  • Python實現(xiàn)多腳本處理定時運行

    Python實現(xiàn)多腳本處理定時運行

    這篇文章主要介紹了Python實現(xiàn)多腳本處理定時運行,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • Python開發(fā)之迭代器&生成器的實戰(zhàn)案例分享

    Python開發(fā)之迭代器&生成器的實戰(zhàn)案例分享

    在 Python 中,迭代器和生成器都是用來遍歷數(shù)據集合的工具,可以按需逐個生成或返回數(shù)據,從而避免一次性加載整個數(shù)據集合所帶來的性能問題和內存消耗問題。本文主要和大家分享幾個貼近實際運維開發(fā)工作中的場景案例,希望對大家有所幫助
    2023-04-04
  • Django數(shù)據庫(SQlite)基本入門使用教程

    Django數(shù)據庫(SQlite)基本入門使用教程

    django有默認自帶的數(shù)據庫,當然也可以用其他的數(shù)據庫,下面這篇文章主要給大家介紹了關于Django數(shù)據庫(SQlite)基本入門使用教程的相關資料,需要的朋友可以參考下
    2022-07-07

最新評論

徐汇区| 开封市| 上高县| 双牌县| 蒙山县| 绥棱县| 岐山县| 宜都市| 玛曲县| 浦江县| 阳新县| 汉阴县| 鹿泉市| 文成县| 白朗县| 托克逊县| 英德市| 宁夏| 沐川县| 马公市| 长阳| 汤原县| 庆云县| 蓝田县| 鄂托克旗| 六安市| 凤冈县| 贵南县| 金川县| 隆安县| 教育| 甘孜县| 四子王旗| 蓬安县| 巍山| 随州市| 敦煌市| 彝良县| 宁陵县| 二连浩特市| 青州市|