色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(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ā)編程有很多方法,多線程的標(biāo)準(zhǔn)庫(kù) threading,concurrency,協(xié)程 asyncio,當(dāng)然還有 grequests 這種異步庫(kù),每一個(gè)都可以實(shí)現(xiàn)上述需求,下面一一用代碼實(shí)現(xiàn)一下,本文的代碼可以直接運(yùn)行,給你以后的并發(fā)編程作為參考:

隊(duì)列+多線程定義一個(gè)大小為 400 的隊(duì)列,然后開(kāi)啟 200 個(gè)線程,每個(gè)線程都是不斷的從隊(duì)列中獲取 url 并訪問(wè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 到新技能?

線程池

如果你使用線程池,推薦使用更高級(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]>]

最后的話

今天分享了并發(fā) http 請(qǐng)求的幾種實(shí)現(xiàn)方式,有人說(shuō)異步(協(xié)程)性能比多線程好,其實(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)注

    88

    文章

    3614

    瀏覽量

    93686
  • HTTP
    +關(guān)注

    關(guān)注

    0

    文章

    504

    瀏覽量

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

    關(guān)注

    0

    文章

    139

    瀏覽量

    15328
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4792

    瀏覽量

    84628

原文標(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)推薦

    HTTP相關(guān)返回值異常如何解決(上篇)

    協(xié)議。它是萬(wàn)維網(wǎng)(WWW)的基礎(chǔ),允許客戶端(通常是網(wǎng)頁(yè)瀏覽器)與服務(wù)器之間進(jìn)行通信。以下是對(duì) HTTP些基本介紹: 基本概念 請(qǐng)求-響應(yīng)模型: HTTP 使用
    的頭像 發(fā)表于 10-20 16:40 ?281次閱讀
    <b class='flag-5'>HTTP</b>相關(guān)返回值異常如何解決(上篇)

    并發(fā)物聯(lián)網(wǎng)云平臺(tái)是什么

    并發(fā)物聯(lián)網(wǎng)云平臺(tái)是種能夠處理大量設(shè)備同時(shí)連接并進(jìn)行數(shù)據(jù)交換的云計(jì)算平臺(tái)。這種平臺(tái)通常被設(shè)計(jì)用來(lái)應(yīng)對(duì)來(lái)自數(shù)以萬(wàn)計(jì)甚至數(shù)十億計(jì)的物聯(lián)網(wǎng)設(shè)備的并發(fā)請(qǐng)求,保證系統(tǒng)的穩(wěn)定性和響應(yīng)速度。 首先
    的頭像 發(fā)表于 08-13 13:50 ?249次閱讀

    請(qǐng)問(wèn)如何使用HTTP請(qǐng)求獲取本地時(shí)間?

    我正在嘗試使用 AT 命令和 HTTP 請(qǐng)求獲取本地時(shí)間,我已經(jīng)從中獲得了時(shí)間www.gooogle.com但這個(gè)時(shí)間是GMT時(shí)區(qū), 我想知道如何獲取本地時(shí)區(qū),我已經(jīng)嘗試過(guò) AT CIPNTP,但它不起作用。
    發(fā)表于 07-16 06:20

    如何使用RTOS SDK 2.1.0從esp8266發(fā)送http請(qǐng)求

    我需要從我的 esp8266 向 Shelly 插頭發(fā)出 http 請(qǐng)求才能打開(kāi)它。如何使用 RTOS SDK 2.1.0 從我的 esp8266 發(fā)送 http 請(qǐng)求
    發(fā)表于 07-09 06:24

    鴻蒙開(kāi)發(fā)網(wǎng)絡(luò)管理: @ohos.net.http 數(shù)據(jù)請(qǐng)求

    個(gè)httpRequest對(duì)應(yīng)個(gè)http請(qǐng)求任務(wù),不可復(fù)用
    的頭像 發(fā)表于 06-18 15:42 ?816次閱讀
    鴻蒙開(kāi)發(fā)網(wǎng)絡(luò)管理: @ohos.net.<b class='flag-5'>http</b>  數(shù)據(jù)<b class='flag-5'>請(qǐng)求</b>

    stm32cube配置lwip,http下發(fā)請(qǐng)求后為什么沒(méi)有反饋ACK?

    使用工具查看,3次握手成功,http下發(fā)請(qǐng)求,芯片收到請(qǐng)求后發(fā)送響應(yīng)。但是http下發(fā)請(qǐng)求后,不知道為什么沒(méi)有反饋ACK。導(dǎo)致客戶端沒(méi)有收到
    發(fā)表于 06-03 07:45

    手把手教學(xué)!HLK-LD2410B/C新手必看攻略!測(cè)試教程、模塊調(diào)參詳解~

    HLK-LD2410B/C接線教程、參數(shù)解析、APP調(diào)參教程、上位機(jī)調(diào)參教程、常見(jiàn)異常情況自檢等等內(nèi)容,文匯總。 不管是萌新小白還是資深玩家,都可以快速入門(mén)。
    的頭像 發(fā)表于 05-31 14:48 ?5001次閱讀
    手把手教學(xué)!HLK-LD2410B/C新手必看攻略!測(cè)試教程、模塊調(diào)參<b class='flag-5'>一</b><b class='flag-5'>文</b>詳解~

    串口屏的幾種安裝方式

    串口屏的幾種安裝方式
    的頭像 發(fā)表于 05-10 11:28 ?1550次閱讀

    鴻蒙OS開(kāi)發(fā)實(shí)戰(zhàn):【網(wǎng)絡(luò)管理HTTP數(shù)據(jù)請(qǐng)求

    應(yīng)用通過(guò)HTTP發(fā)起個(gè)數(shù)據(jù)請(qǐng)求,支持常見(jiàn)的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。
    的頭像 發(fā)表于 04-01 16:31 ?693次閱讀
    鴻蒙OS開(kāi)發(fā)實(shí)戰(zhàn):【網(wǎng)絡(luò)管理<b class='flag-5'>HTTP</b>數(shù)據(jù)<b class='flag-5'>請(qǐng)求</b>】

    鴻蒙OS開(kāi)發(fā)實(shí)例:【窺探網(wǎng)絡(luò)請(qǐng)求

    HarmonyOS 平臺(tái)中使用網(wǎng)絡(luò)請(qǐng)求,需要引入 "@ohos.net.http", 并且需要在 module.json5 文件中申請(qǐng)網(wǎng)絡(luò)權(quán)限, 即 “ohos.permission.INTERNET” 本篇文章將嘗試使用 @ohos.net.
    的頭像 發(fā)表于 04-01 16:11 ?766次閱讀
    鴻蒙OS開(kāi)發(fā)實(shí)例:【窺探網(wǎng)絡(luò)<b class='flag-5'>請(qǐng)求</b>】

    鴻蒙原生應(yīng)用開(kāi)發(fā)-網(wǎng)絡(luò)管理HTTP數(shù)據(jù)請(qǐng)求

    、場(chǎng)景介紹 應(yīng)用通過(guò)HTTP發(fā)起個(gè)數(shù)據(jù)請(qǐng)求,支持常見(jiàn)的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 二、接口說(shuō)明
    發(fā)表于 03-29 17:51

    鴻蒙OS開(kāi)發(fā)實(shí)例:【工具類(lèi)封裝-http請(qǐng)求

    ;@ohos.promptAction';** **封裝HTTP接口請(qǐng)求類(lèi),提供格式化的響應(yīng)信息輸出功能。 使用 DevEco Studio 3.1.1 Release 及以上版本,API 版本為 api 9 及以上
    的頭像 發(fā)表于 03-27 22:32 ?1356次閱讀
    鴻蒙OS開(kāi)發(fā)實(shí)例:【工具類(lèi)封裝-<b class='flag-5'>http</b><b class='flag-5'>請(qǐng)求</b>】

    arkts http 發(fā)起請(qǐng)求失敗

    http 發(fā)起請(qǐng)求 官網(wǎng)Http庫(kù)
    發(fā)表于 03-23 00:33

    java實(shí)現(xiàn)多線程的幾種方式

    Java實(shí)現(xiàn)多線程的幾種方式 多線程是指程序中包含了兩個(gè)或以上的線程,每個(gè)線程都可以并行執(zhí)行不同的任務(wù)或操作。Java中的多線程可以提高程序的效率和性能,使得程序可以同時(shí)處理多個(gè)任務(wù)。 Java提供
    的頭像 發(fā)表于 03-14 16:55 ?688次閱讀

    HTTP協(xié)議的運(yùn)作方式請(qǐng)求/響應(yīng)的步驟

    基于HTTP的客戶/服務(wù)器模式的信息交換過(guò)程它分四個(gè)過(guò)程建立連接、發(fā)送請(qǐng)求信息、發(fā)送響應(yīng)信息、關(guān)閉連接。
    的頭像 發(fā)表于 02-01 11:02 ?1396次閱讀
    <b class='flag-5'>HTTP</b>協(xié)議的運(yùn)作<b class='flag-5'>方式</b>及<b class='flag-5'>請(qǐng)求</b>/響應(yīng)的步驟
    主站蜘蛛池模板: 97视频在线免费| 欧美在线看欧美视频免费| 一本道高清不卡v免费费| 国产在线精品视频免费观看| 亚洲AV无码乱码A片无码蜜桃| 国产69精品久久久久无码麻豆| 日韩中文无线码在线视频| 成人久久欧美日韩一区二区三区| 日本漫画母亲口工子全彩| 成人在免费视频手机观看网站| 色怕怕| 国产成人免费a在线资源| 午夜免费体验30分| 国内2018年午夜福利5678| 亚洲最大在线视频| 久久中文字幕无码A片不卡| 1V1各种PLAY女主被肉| 女人一级毛片免费视频观看| TUBE69CHINESE学生| 日韩视频在线观看| 国产乱人偷精品视频A人人澡| 亚洲AV中文字幕无码久久| 九色PORNY真实丨首页| 中文无码字慕在线观看| 浓毛BWBWBWBWBW日本| 超碰在线视频地址| 无限资源好看片2019免费观看| 韩国g奶空姐| 在线观看视频一区| 欧美精品3atv一区二区三区| 俄罗斯极品hd| 亚洲精品国产乱码AV在线观看 | 蜜芽tv在线www| metart中国撒尿人体欣赏| 色综合99久久久国产AV| 国产在线精品一区二区在线看| 一级毛片直接看| 欧美高清另类video| 公交车被CAO到合不拢腿| 亚洲精品国产在线网站| 妈妈的朋友5在线观看免费完整版中文|