chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一文匯總并發(fā)http請求最快的幾種實現方式用

Linux愛好者 ? 來源:Python七號 ? 作者: somenzz ? 2021-10-20 14:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

假如有一個文件,里面有 10 萬個 url,需要對每個 url 發(fā)送 http 請求,并打印請求結果的狀態(tài)碼,如何編寫代碼盡可能快的完成這些任務呢?

Python 并發(fā)編程有很多方法,多線程的標準庫 threading,concurrency,協程 asyncio,當然還有 grequests 這種異步庫,每一個都可以實現上述需求,下面一一用代碼實現一下,本文的代碼可以直接運行,給你以后的并發(fā)編程作為參考:

隊列+多線程定義一個大小為 400 的隊列,然后開啟 200 個線程,每個線程都是不斷的從隊列中獲取 url 并訪問。

主線程讀取文件中的 url 放入隊列中,然后等待隊列中所有的元素都被接收和處理完畢。代碼如下:

fromthreadingimportThread
importsys
fromqueueimportQueue
importrequests

concurrent=200


defdoWork():
whileTrue:
url=q.get()
status,url=getStatus(url)
doSomethingWithResult(status,url)
q.task_done()


defgetStatus(ourl):
try:
res=requests.get(ourl)
returnres.status_code,ourl
except:
return"error",ourl


defdoSomethingWithResult(status,url):
print(status,url)


q=Queue(concurrent*2)
foriinrange(concurrent):
t=Thread(target=doWork)
t.daemon=True
t.start()

try:
forurlinopen("urllist.txt"):
q.put(url.strip())
q.join()
exceptKeyboardInterrupt:
sys.exit(1)

運行結果如下:

77fe1322-3162-11ec-82a8-dac502259ad0.png

有沒有 get 到新技能?

線程池

如果你使用線程池,推薦使用更高級的 concurrent.futures 庫:

importconcurrent.futures
importrequests

out=[]
CONNECTIONS=100
TIMEOUT=5

urls=[]
withopen("urllist.txt")asreader:
forurlinreader:
urls.append(url.strip())

defload_url(url,timeout):
ans=requests.get(url,timeout=timeout)
returnans.status_code

withconcurrent.futures.ThreadPoolExecutor(max_workers=CONNECTIONS)asexecutor:
future_to_url=(executor.submit(load_url,url,TIMEOUT)forurlinurls)
forfutureinconcurrent.futures.as_completed(future_to_url):
try:
data=future.result()
exceptExceptionasexc:
data=str(type(exc))
finally:
out.append(data)
print(data)

協程 + aiohttp

協程也是并發(fā)非常常用的工具了:

importasyncio
fromaiohttpimportClientSession,ClientConnectorError

asyncdeffetch_html(url:str,session:ClientSession,**kwargs)->tuple:
try:
resp=awaitsession.request(method="GET",url=url,**kwargs)
exceptClientConnectorError:
return(url,404)
return(url,resp.status)

asyncdefmake_requests(urls:set,**kwargs)->None:
asyncwithClientSession()assession:
tasks=[]
forurlinurls:
tasks.append(
fetch_html(url=url,session=session,**kwargs)
)
results=awaitasyncio.gather(*tasks)

forresultinresults:
print(f'{result[1]}-{str(result[0])}')

if__name__=="__main__":
importsys
assertsys.version_info>=(3,7),"ScriptrequiresPython3.7+."
withopen("urllist.txt")asinfile:
urls=set(map(str.strip,infile))
asyncio.run(make_requests(urls=urls))

grequests[1]

這是個第三方庫,目前有 3.8K 個星,就是 Requests + Gevent[2],讓異步 http 請求變得更加簡單。Gevent 的本質還是協程。

使用前:

pipinstallgrequests

使用起來那是相當的簡單:

importgrequests

urls=[]
withopen("urllist.txt")asreader:
forurlinreader:
urls.append(url.strip())

rs=(grequests.get(u)foruinurls)

forresultingrequests.map(rs):
print(result.status_code,result.url)

注意 grequests.map(rs) 是并發(fā)執(zhí)行的。運行結果如下:

78759172-3162-11ec-82a8-dac502259ad0.png

也可以加入異常處理:

>>>defexception_handler(request,exception):
...print("Requestfailed")

>>>reqs=[
...grequests.get('http://httpbin.org/delay/1',timeout=0.001),
...grequests.get('http://fakedomain/'),
...grequests.get('http://httpbin.org/status/500')]
>>>grequests.map(reqs,exception_handler=exception_handler)
Requestfailed
Requestfailed
[None,None,500]>]

最后的話

今天分享了并發(fā) http 請求的幾種實現方式,有人說異步(協程)性能比多線程好,其實要分場景看的,沒有一種方法適用所有的場景,筆者就曾做過一個實驗,也是請求 url,當并發(fā)數量超過 500 時,協程明顯變慢。

編輯:jq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 編程
    +關注

    關注

    90

    文章

    3709

    瀏覽量

    96876
  • HTTP
    +關注

    關注

    0

    文章

    531

    瀏覽量

    34899
  • URL
    URL
    +關注

    關注

    0

    文章

    141

    瀏覽量

    16130
  • python
    +關注

    關注

    57

    文章

    4861

    瀏覽量

    89670

原文標題:如何用最快的方式發(fā)送 10 萬個 http 請求?

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    使用HTTP實現IAP的方法

    。 HTTP 基于 TCP 協議運行,它提供了種以 HTML 表單形式從 Web 客戶端(Mozilla Firefox或 Microsoft Internet Explorer)發(fā)送二進制文件的方式。這稱為
    發(fā)表于 12-16 06:18

    HTTP開發(fā)必備:核心庫與httpplus擴展庫應用示例全攻略

    HTTP開發(fā)的必備參考!本文匯總核心庫基礎操作與httpplus擴展庫高級特性,通過示例解析,讓你快速上手各類HTTP開發(fā)需求。
    的頭像 發(fā)表于 09-20 15:19 ?3056次閱讀
    <b class='flag-5'>HTTP</b>開發(fā)必備:核心庫與httpplus擴展庫應用示例全攻略

    軟通動力攜手懿文匯推出全域級元服務平臺“發(fā)現蚌埠”

    華為開發(fā)者大會 2025期間,軟通動力聯合戰(zhàn)略合作伙伴蚌埠旅投資集團旗下懿文匯數字科技(安徽)有限公司(簡稱“懿文匯”)發(fā)布全域級元服務平臺“發(fā)現蚌埠”,其通過數智旅模塊切入本地生
    的頭像 發(fā)表于 06-26 14:19 ?616次閱讀

    Ingress網關高并發(fā)請求的解決方案

    當 Ingress 網關面臨高并發(fā)請求(如 QPS 超過 10萬+)時,可能導致服務崩潰、響應延遲激增或資源耗盡。
    的頭像 發(fā)表于 05-14 11:52 ?696次閱讀

    在KaihongOS應用開發(fā)中,如何通過HTTP發(fā)起個數據請求

    Http 在KaihongOS應用開發(fā)中,可以通過HTTP發(fā)起個數據請求,支持常見的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法
    發(fā)表于 05-08 06:44

    常見網絡負載均衡的幾種方式

    常見網絡負載均衡的幾種方式包括:DNS負載均衡、反向代理負載均衡、IP負載均衡、應用層負載均衡、鏈路層負載均衡。以下是小編對幾種常見的網絡負載均衡方式及其詳細展開介紹。
    的頭像 發(fā)表于 03-06 11:14 ?1118次閱讀

    文匯總開關電源經典問答

    01 問題:開關電源變壓器如果銅帶取代漆包線,其允許通過的電流怎么算?比如說厚度為0.1mm的銅帶,允許通過的電流怎么算? 解答:如果開關電源變壓器用銅帶取代漆包線,銅帶(漆包線)的渦流損耗可以
    的頭像 發(fā)表于 01-08 10:06 ?1435次閱讀

    服務器如何處理 HTTP 請求

    服務器處理HTTP請求的過程是個有序且復雜的流程,通常涉及多個步驟。以下是服務器處理HTTP請求的具體步驟: 監(jiān)聽端口 :
    的頭像 發(fā)表于 12-30 09:37 ?1045次閱讀

    如何調試 HTTP 請求和響應

    調試HTTP請求和響應是Web開發(fā)和網絡編程中的個重要技能。以下是些步驟和工具,可以幫助你調試HTTP
    的頭像 發(fā)表于 12-30 09:28 ?1855次閱讀

    如何使用 cURL 測試 HTTP 協議

    cURL是個強大的命令行工具,用于傳輸數據,支持多種協議,包括HTTP、HTTPS、FTP等。使用cURL測試HTTP協議可以幫助你理解HTTP
    的頭像 發(fā)表于 12-30 09:26 ?2169次閱讀

    HTTP 1.1 和 HTTP 2.0 的區(qū)別

    HTTP(超文本傳輸協議)是互聯網上應用最為廣泛的協議之,用于在客戶端和服務器之間傳輸數據。隨著技術的發(fā)展,HTTP協議也在不斷地更新和優(yōu)化。HTTP/1.1是1999年發(fā)布的,而
    的頭像 發(fā)表于 12-30 09:25 ?1858次閱讀

    如何使用 HTTP 協議進行數據傳輸

    在互聯網時代,數據傳輸是信息交換的基礎。HTTP協議作為最常用的數據傳輸協議之,支撐著全球數十億用戶的數據交互。 HTTP協議的基本概念 請求-響應模型 :
    的頭像 發(fā)表于 12-30 09:24 ?2212次閱讀

    如何實現 HTTP 協議的安全性

    HTTP(超文本傳輸協議)是互聯網上應用最為廣泛的協議之,用于從服務器傳輸超文本到本地瀏覽器的傳輸協議。然而,HTTP協議本身并沒有加密機制,因此傳輸的數據容易被竊聽、篡改和偽造。為了實現
    的頭像 發(fā)表于 12-30 09:22 ?1531次閱讀

    HTTP 協議的工作原理

    HTTP協議的工作原理 1. HTTP協議概述 HTTP個應用層協議,它定義了客戶端與服務器之間請求和響應的格式。
    的頭像 發(fā)表于 12-30 09:21 ?1656次閱讀

    HTTP 協議的基本概念

    HTTP(HyperText Transfer Protocol,超文本傳輸協議)是種用于分布式、協作式、超媒體信息系統的網絡協議。HTTP 是互聯網上應用最為廣泛的協議之,它定義
    的頭像 發(fā)表于 12-29 15:12 ?2276次閱讀