精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

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

Linux愛好者 ? 來源:Python七號 ? 作者: somenzz ? 2021-10-20 14:36 ? 次閱讀

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

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

隊列+多線程定義一個大小為 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

協程也是并發非常常用的工具了:

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) 是并發執行的。運行結果如下:

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

最后的話

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

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

    關注

    88

    文章

    3595

    瀏覽量

    93601
  • HTTP
    +關注

    關注

    0

    文章

    501

    瀏覽量

    31065
  • URL
    URL
    +關注

    關注

    0

    文章

    139

    瀏覽量

    15312
  • python
    +關注

    關注

    56

    文章

    4782

    瀏覽量

    84461

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

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

收藏 人收藏

    評論

    相關推薦

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

    協議。它是萬維網(WWW)的基礎,允許客戶端(通常是網頁瀏覽器)與服務器之間進行通信。以下是對 HTTP些基本介紹: 基本概念 請求-響應模型: HTTP 使用
    的頭像 發表于 10-20 16:40 ?225次閱讀
    <b class='flag-5'>HTTP</b>相關返回值異常如何解決(上篇)

    并發物聯網云平臺是什么

    并發物聯網云平臺是種能夠處理大量設備同時連接并進行數據交換的云計算平臺。這種平臺通常被設計用來應對來自數以萬計甚至數十億計的物聯網設備的并發請求,保證系統的穩定性和響應速度。 首先
    的頭像 發表于 08-13 13:50 ?217次閱讀

    請問如何使用HTTP請求獲取本地時間?

    我正在嘗試使用 AT 命令和 HTTP 請求獲取本地時間,我已經從中獲得了時間www.gooogle.com但這個時間是GMT時區, 我想知道如何獲取本地時區,我已經嘗試過 AT CIPNTP,但它不起作用。
    發表于 07-16 06:20

    如何使用RTOS SDK 2.1.0從esp8266發送http請求

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

    鴻蒙開發網絡管理: @ohos.net.http 數據請求

    個httpRequest對應http請求任務,不可復用
    的頭像 發表于 06-18 15:42 ?759次閱讀
    鴻蒙開發網絡管理: @ohos.net.<b class='flag-5'>http</b>  數據<b class='flag-5'>請求</b>

    stm32cube配置lwip,http下發請求后為什么沒有反饋ACK?

    使用工具查看,3次握手成功,http下發請求,芯片收到請求后發送響應。但是http下發請求后,不知道為什么沒有反饋ACK。導致客戶端沒有收到
    發表于 06-03 07:45

    手把手教學!HLK-LD2410B/C新手必看攻略!測試教程、模塊調參詳解~

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

    串口屏的幾種安裝方式

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

    鴻蒙OS開發實戰:【網絡管理HTTP數據請求

    應用通過HTTP發起個數據請求,支持常見的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。
    的頭像 發表于 04-01 16:31 ?669次閱讀
    鴻蒙OS開發實戰:【網絡管理<b class='flag-5'>HTTP</b>數據<b class='flag-5'>請求</b>】

    鴻蒙原生應用開發-網絡管理HTTP數據請求

    、場景介紹 應用通過HTTP發起個數據請求,支持常見的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 二、接口說明
    發表于 03-29 17:51

    鴻蒙OS開發實例:【工具類封裝-http請求

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

    arkts http 發起請求失敗

    http 發起請求 官網Http
    發表于 03-23 00:33

    java實現多線程的幾種方式

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

    HTTP協議的運作方式請求/響應的步驟

    基于HTTP的客戶/服務器模式的信息交換過程它分四個過程建立連接、發送請求信息、發送響應信息、關閉連接。
    的頭像 發表于 02-01 11:02 ?1311次閱讀
    <b class='flag-5'>HTTP</b>協議的運作<b class='flag-5'>方式</b>及<b class='flag-5'>請求</b>/響應的步驟

    redis高并發能力直接相關概念有哪些

    請求和響應,這意味著它可以同時處理多個客戶端請求,而不需要等待每個請求的完成。這種機制是通過使用事件驅動的編程模型和底層的網絡庫來實現的。非阻塞IO可以大大提高Redis的
    的頭像 發表于 12-05 10:34 ?1155次閱讀