日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文匯總并發(fā)http請(qǐng)求最快的幾種實(shí)現(xiàn)方式用

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

掃碼添加小助手

加入工程師交流群

假如有一個(gè)文件,里面有 10 萬(wàn)個(gè) url,需要對(duì)每個(gè) url 發(fā)送 http 請(qǐng)求,并打印請(qǐng)求結(jié)果的狀態(tài)碼,如何編寫(xiě)代碼盡可能快的完成這些任務(wù)呢?

Python 并發(fā)編程有很多方法,多線(xiàn)程的標(biāo)準(zhǔn)庫(kù) threading,concurrency,協(xié)程 asyncio,當(dāng)然還有 grequests 這種異步庫(kù),每一個(gè)都可以實(shí)現(xiàn)上述需求,下面一一用代碼實(shí)現(xiàn)一下,本文的代碼可以直接運(yùn)行,給你以后的并發(fā)編程作為參考:

隊(duì)列+多線(xiàn)程定義一個(gè)大小為 400 的隊(duì)列,然后開(kāi)啟 200 個(gè)線(xiàn)程,每個(gè)線(xiàn)程都是不斷的從隊(duì)列中獲取 url 并訪(fǎng)問(wèn)。

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

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)

運(yùn)行結(jié)果如下:

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

有沒(méi)有 get 到新技能?

線(xiàn)程池

如果你使用線(xiàn)程池,推薦使用更高級(jí)的 concurrent.futures 庫(kù):

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)

協(xié)程 + aiohttp

協(xié)程也是并發(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]

這是個(gè)第三方庫(kù),目前有 3.8K 個(gè)星,就是 Requests + Gevent[2],讓異步 http 請(qǐng)求變得更加簡(jiǎn)單。Gevent 的本質(zhì)還是協(xié)程。

使用前:

pipinstallgrequests

使用起來(lái)那是相當(dāng)?shù)暮?jiǎn)單:

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í)行的。運(yùn)行結(jié)果如下:

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]>]

最后的話(huà)

今天分享了并發(fā) http 請(qǐng)求的幾種實(shí)現(xiàn)方式,有人說(shuō)異步(協(xié)程)性能比多線(xiàn)程好,其實(shí)要分場(chǎng)景看的,沒(méi)有一種方法適用所有的場(chǎng)景,筆者就曾做過(guò)一個(gè)實(shí)驗(yàn),也是請(qǐng)求 url,當(dāng)并發(fā)數(shù)量超過(guò) 500 時(shí),協(xié)程明顯變慢。

編輯:jq
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程
    +關(guān)注

    關(guān)注

    90

    文章

    3724

    瀏覽量

    97458
  • HTTP
    +關(guān)注

    關(guān)注

    0

    文章

    538

    瀏覽量

    35571
  • URL
    URL
    +關(guān)注

    關(guān)注

    0

    文章

    142

    瀏覽量

    16287
  • python
    +關(guān)注

    關(guān)注

    58

    文章

    4889

    瀏覽量

    90330

原文標(biāo)題:如何用最快的方式發(fā)送 10 萬(wàn)個(gè) http 請(qǐng)求?

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Java并發(fā)編程的“基石”——多線(xiàn)程概念初識(shí)

    之下,隱藏著個(gè)龐大而復(fù)雜的“算力帝國(guó)”。如何將成千上萬(wàn)塊 GPU 的算力精準(zhǔn)、高效地分配給無(wú)數(shù)個(gè)并發(fā)的 AI 任務(wù)?這便是 AI 算力調(diào)度的核心使命。在這個(gè)看似屬于 Python 和 C++ 的絕對(duì)
    發(fā)表于 04-16 18:50

    微課-掌握J(rèn)ava并發(fā)編程的“基石”,入門(mén)并發(fā)編程

    未來(lái)高并發(fā)系統(tǒng)底層邏輯:從入門(mén)掌握 Java 并發(fā)編程基石 在人類(lèi)商業(yè)文明向數(shù)字化全面遷移的宏大進(jìn)程中,有條隱秘但鐵般的經(jīng)濟(jì)學(xué)法則正在被無(wú)限放大:在算力、存儲(chǔ)和網(wǎng)絡(luò)帶寬構(gòu)成的基礎(chǔ)設(shè)
    的頭像 發(fā)表于 04-14 14:25 ?120次閱讀

    Go 語(yǔ)言高并發(fā)服務(wù)設(shè)計(jì)與性能調(diào)優(yōu)實(shí)戰(zhàn):從萬(wàn)級(jí)到百萬(wàn)級(jí)并發(fā)的演進(jìn)之路

    ;, http.StatusTooManyRequests) return } // 處理請(qǐng)求 handleRequest(w, r) } // 熔斷器實(shí)現(xiàn) type CircuitBreaker struct {
    發(fā)表于 02-18 19:19

    說(shuō)透了如何實(shí)現(xiàn)單片機(jī)的多任務(wù)并發(fā)!

    資源,并且避免出現(xiàn)資源爭(zhēng)搶和堵塞的情況。 在單片機(jī)多任務(wù)并發(fā)中,常見(jiàn)的任務(wù)調(diào)度方式有兩種: 1. 時(shí)間片輪轉(zhuǎn)法 時(shí)間片輪轉(zhuǎn)法是多任務(wù)并發(fā)中最基本的調(diào)度算法之,它的核心思想是輪流分配
    發(fā)表于 01-06 06:46

    HTTP通信網(wǎng)關(guān)是什么?有什么功能?

    HTTP通信網(wǎng)關(guān)是連接不同網(wǎng)絡(luò)或協(xié)議的關(guān)鍵設(shè)備/服務(wù)器,在HTTP通信中扮演著協(xié)議轉(zhuǎn)換、安全加固、性能優(yōu)化等核心角色,其本質(zhì)是 實(shí)現(xiàn)不同協(xié)議或網(wǎng)絡(luò)間的數(shù)據(jù)轉(zhuǎn)發(fā)與處理 。以下是其核心功能與工作機(jī)制
    的頭像 發(fā)表于 12-23 11:14 ?656次閱讀

    使用HTTP實(shí)現(xiàn)IAP的方法

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

    MCU固件幾種Flash(閃存)劃分方式

    你通過(guò)U盤(pán)、OTA遠(yuǎn)程等方式下載的程序,其實(shí)你還是需要提前下載BootLoader程序,才能進(jìn)步下載APP程序。? ? ?今天就來(lái)說(shuō)說(shuō)通過(guò)OTA方式升級(jí)固件時(shí),幾種Flash(閃存)
    的頭像 發(fā)表于 11-27 18:20 ?1402次閱讀

    LuatOS Air780EPM 開(kāi)發(fā)板 HTTP 教程:原理講解與項(xiàng)目實(shí)操!

    本篇教程將系統(tǒng)介紹 LuatOS Air780EPM 在 HTTP 通信中的應(yīng)用,從請(qǐng)求機(jī)制到響應(yīng)解析,配合完整代碼演示,讓你輕松實(shí)現(xiàn)設(shè)備端與云端的數(shù)據(jù)交互。 、
    的頭像 發(fā)表于 09-26 20:36 ?1251次閱讀
    LuatOS Air780EPM 開(kāi)發(fā)板 <b class='flag-5'>HTTP</b> 教程:原理講解與項(xiàng)目實(shí)操!

    HTTP開(kāi)發(fā)必備:核心庫(kù)與httpplus擴(kuò)展庫(kù)應(yīng)用示例全攻略

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

    科普 | 5G公網(wǎng)對(duì)講有幾種實(shí)現(xiàn)方式?

    對(duì)講機(jī)的通信方式,通過(guò)PTT按鍵,實(shí)現(xiàn)鍵對(duì)講的通信方式,應(yīng)用在些關(guān)鍵業(yè)務(wù)通信,應(yīng)急通信,行業(yè)工作環(huán)境下的通信需求。要
    的頭像 發(fā)表于 09-03 14:14 ?1357次閱讀
    科普 | 5G公網(wǎng)對(duì)講有<b class='flag-5'>幾種</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>方式</b>?

    第九章 W55MH32 HTTP Server示例

    本文介紹了在 W55MH32?芯片上實(shí)現(xiàn) HTTP Server?功能,并通過(guò)瀏覽器修改其網(wǎng)絡(luò)地址信息的方法。闡述了 HTTP?協(xié)議的概念、特點(diǎn)、應(yīng)用場(chǎng)景、工作流程、請(qǐng)求方法、響應(yīng)內(nèi)容
    的頭像 發(fā)表于 07-24 09:35 ?1426次閱讀
    第九章 W55MH32 <b class='flag-5'>HTTP</b> Server示例

    軟通動(dòng)力攜手懿文匯推出全域級(jí)元服務(wù)平臺(tái)“發(fā)現(xiàn)蚌埠”

    華為開(kāi)發(fā)者大會(huì) 2025期間,軟通動(dòng)力聯(lián)合戰(zhàn)略合作伙伴蚌埠旅投資集團(tuán)旗下懿文匯數(shù)字科技(安徽)有限公司(簡(jiǎn)稱(chēng)“懿文匯”)發(fā)布全域級(jí)元服務(wù)平臺(tái)“發(fā)現(xiàn)蚌埠”,其通過(guò)數(shù)智旅模塊切入本地生
    的頭像 發(fā)表于 06-26 14:19 ?961次閱讀

    軟通動(dòng)力與懿文匯數(shù)字科技達(dá)成戰(zhàn)略合作

    近日,軟通動(dòng)力與蚌埠旅投資集團(tuán)旗下懿文匯數(shù)字科技(安徽)有限公司達(dá)成戰(zhàn)略合作,將依托軟通動(dòng)力在旅行業(yè)深厚的元服務(wù)軟硬體解決方案能力,為“發(fā)現(xiàn)蚌埠”平臺(tái)注入前沿技術(shù)動(dòng)能,同時(shí)聚焦數(shù)
    的頭像 發(fā)表于 05-26 16:57 ?1216次閱讀

    Ingress網(wǎng)關(guān)高并發(fā)請(qǐng)求的解決方案

    當(dāng) Ingress 網(wǎng)關(guān)面臨高并發(fā)請(qǐng)求(如 QPS 超過(guò) 10萬(wàn)+)時(shí),可能導(dǎo)致服務(wù)崩潰、響應(yīng)延遲激增或資源耗盡。
    的頭像 發(fā)表于 05-14 11:52 ?1054次閱讀

    在KaihongOS應(yīng)用開(kāi)發(fā)中,如何通過(guò)HTTP發(fā)起個(gè)數(shù)據(jù)請(qǐng)求

    Http 在KaihongOS應(yīng)用開(kāi)發(fā)中,可以通過(guò)HTTP發(fā)起個(gè)數(shù)據(jù)請(qǐng)求,支持常見(jiàn)的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法
    發(fā)表于 05-08 06:44
    东源县| 临猗县| 宜兰县| 安泽县| 阜新市| 蕉岭县| 称多县| 柞水县| 永靖县| 肥乡县| 十堰市| 铁岭市| 安远县| 邹平县| 调兵山市| 扬州市| 谢通门县| 滦南县| 剑川县| 肥城市| 都兰县| 建德市| 广汉市| 开鲁县| 兴山县| 永善县| 上犹县| 内乡县| 重庆市| 明光市| 历史| 探索| 轮台县| 边坝县| 贵州省| 萍乡市| 同仁县| 芜湖市| 乌兰县| 铁岭市| 龙门县|