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
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    90

    文章

    3723

    浏览量

    97442
  • HTTP
    +关注

    关注

    0

    文章

    538

    浏览量

    35558
  • URL
    URL
    +关注

    关注

    0

    文章

    142

    浏览量

    16283
  • python
    +关注

    关注

    58

    文章

    4885

    浏览量

    90314

原文标题:如何用最快的方式发送 10 万个 http 请求?

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Java并发编程的“基石”——多线程概念初识

    之下,隐藏着个庞大而复杂的“算力帝国”。如何将成千上万块 GPU 的算力精准、高效地分配给无数个并发的 AI 任务?这便是 AI 算力调度的核心使命。在这个看似属于 Python 和 C++ 的绝对
    发表于 04-16 18:50

    微课-掌握Java并发编程的“基石”,入门并发编程

    未来高并发系统底层逻辑:从入门掌握 Java 并发编程基石 在人类商业文明向数字化全面迁移的宏大进程中,有条隐秘但铁般的经济学法则正在被无限放大:在算力、存储和网络带宽构成的基础设
    的头像 发表于 04-14 14:25 94次阅读

    Go 语言高并发服务设计与性能调优实战:从万级到百万级并发的演进之路

    ;, http.StatusTooManyRequests) return } // 处理请求 handleRequest(w, r) } // 熔断器实现 type CircuitBreaker struct {
    发表于 02-18 19:19

    说透了如何实现单片机的多任务并发

    资源,并且避免出现资源争抢和堵塞的情况。 在单片机多任务并发中,常见的任务调度方式有两种: 1. 时间片轮转法 时间片轮转法是多任务并发中最基本的调度算法之,它的核心思想是轮流分配
    发表于 01-06 06:46

    HTTP通信网关是什么?有什么功能?

    HTTP通信网关是连接不同网络或协议的关键设备/服务器,在HTTP通信中扮演着协议转换、安全加固、性能优化等核心角色,其本质是 实现不同协议或网络间的数据转发与处理 。以下是其核心功能与工作机制
    的头像 发表于 12-23 11:14 624次阅读

    使用HTTP实现IAP的方法

    HTTP 基于 TCP 协议运行,它提供了种以 HTML 表单形式从 Web 客户端(Mozilla Firefox或 Microsoft Internet Explorer)发送二进制文件的方式。这称为
    发表于 12-16 06:18

    MCU固件几种Flash(闪存)划分方式

    你通过U盘、OTA远程等方式下载的程序,其实你还是需要提前下载BootLoader程序,才能进步下载APP程序。     今天就来说说通过OTA方式升级固件时,几种Flash(闪存)
    的头像 发表于 11-27 18:20 1394次阅读

    LuatOS Air780EPM 开发板 HTTP 教程:原理讲解与项目实操!

    本篇教程将系统介绍 LuatOS Air780EPM 在 HTTP 通信中的应用,从请求机制到响应解析,配合完整代码演示,让你轻松实现设备端与云端的数据交互。
    的头像 发表于 09-26 20:36 1226次阅读
    LuatOS Air780EPM 开发板 <b class='flag-5'>HTTP</b> 教程:原理讲解与项目实操!

    HTTP开发必备:核心库与httpplus扩展库应用示例全攻略

    HTTP开发的必备参考!本文汇总核心库基础操作与httpplus扩展库高级特性,通过示例解析,让你快速上手各类HTTP开发需求。
    的头像 发表于 09-20 15:19 3327次阅读
    <b class='flag-5'>HTTP</b>开发必备:核心库与httpplus扩展库应用示例全攻略

    科普 | 5G公网对讲有几种实现方式

    对讲机的通信方式,通过PTT按键,实现键对讲的通信方式,应用在些关键业务通信,应急通信,行业工作环境下的通信需求。要
    的头像 发表于 09-03 14:14 1330次阅读
    科普 | 5G公网对讲有<b class='flag-5'>几种</b><b class='flag-5'>实现</b><b class='flag-5'>方式</b>?

    第九章 W55MH32 HTTP Server示例

    本文介绍了在 W55MH32 芯片上实现 HTTP Server 功能,并通过浏览器修改其网络地址信息的方法。阐述了 HTTP 协议的概念、特点、应用场景、工作流程、请求方法、响应内容
    的头像 发表于 07-24 09:35 1392次阅读
    第九章 W55MH32 <b class='flag-5'>HTTP</b> Server示例

    软通动力携手懿文汇推出全域级元服务平台“发现蚌埠”

    华为开发者大会 2025期间,软通动力联合战略合作伙伴蚌埠旅投资集团旗下懿文汇数字科技(安徽)有限公司(简称“懿文汇”)发布全域级元服务平台“发现蚌埠”,其通过数智旅模块切入本地生
    的头像 发表于 06-26 14:19 944次阅读

    软通动力与懿文汇数字科技达成战略合作

    近日,软通动力与蚌埠旅投资集团旗下懿文汇数字科技(安徽)有限公司达成战略合作,将依托软通动力在旅行业深厚的元服务软硬体解决方案能力,为“发现蚌埠”平台注入前沿技术动能,同时聚焦数
    的头像 发表于 05-26 16:57 1198次阅读

    Ingress网关高并发请求的解决方案

    当 Ingress 网关面临高并发请求(如 QPS 超过 10万+)时,可能导致服务崩溃、响应延迟激增或资源耗尽。
    的头像 发表于 05-14 11:52 1013次阅读

    在KaihongOS应用开发中,如何通过HTTP发起个数据请求

    Http 在KaihongOS应用开发中,可以通过HTTP发起个数据请求,支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法
    发表于 05-08 06:44