asyncio + pycurl + BytesIO 异步批量调用url请求

news/2024/7/3 6:53:01

import asyncio
import pycurl
from io import BytesIO
import json

def fetch_api(url, method, header=None, data=None):
"""
url: 获取api的url
method: 请求方法
header: 请求头
data: 请求参数
"""

if method == "get":
    _Curl = pycurl.Curl()
    buf = BytesIO()
    _Curl.setopt(pycurl.WRITEFUNCTION,buf.write)
    _Curl.setopt(pycurl.URL, url)
    _Curl.setopt(pycurl.HTTPHEADER, header)
    _Curl.perform()
    result = buf.getvalue().decode("utf-8")
    http_code = _Curl.getinfo(_Curl.HTTP_CODE)
    dns_time = _Curl.getinfo(_Curl.NAMELOOKUP_TIME) * 1000 # DNS解析时间
    connect_time = _Curl.getinfo(_Curl.CONNECT_TIME) * 1000 # 建连时间
    pretransafe_time = _Curl.getinfo(_Curl.PRETRANSFER_TIME) * 1000 # 连接上后到开始传输时的时间
    starttransafe_time =_Curl.getinfo(_Curl.STARTTRANSFER_TIME) * 1000 # 接收到第一个字节的时间
    redirect_time = _Curl.getinfo(_Curl.REDIRECT_TIME) * 1000 # 重定向时间
    total_time = _Curl.getinfo(_Curl.TOTAL_TIME) * 1000 # 请求总时间
    download_size = _Curl.getinfo(_Curl.SIZE_DOWNLOAD) # 下载数据包大小
    download_speed = _Curl.getinfo(_Curl.SPEED_DOWNLOAD) # 下载速度
    buf.close()
    print(result)
    print(http_code,dns_time,connect_time,pretransafe_time,starttransafe_time,redirect_time,total_time,download_size,download_speed)
    _Curl.close()

else:
    _Curl = pycurl.Curl()
    _Curl.setopt(pycurl.HTTPHEADER, header)

    buf = BytesIO()
    _Curl.setopt(pycurl.WRITEFUNCTION, buf.write)
    _Curl.setopt(pycurl.URL, url)
    _Curl.setopt(_Curl.POSTFIELDS, data)

    _Curl.perform()
    result = buf.getvalue().decode("utf-8")
    http_code = _Curl.getinfo(_Curl.HTTP_CODE)
    dns_time = _Curl.getinfo(_Curl.NAMELOOKUP_TIME) * 1000  # DNS解析时间
    connect_time = _Curl.getinfo(_Curl.CONNECT_TIME) * 1000  # 建连时间
    pretransafe_time = _Curl.getinfo(_Curl.PRETRANSFER_TIME) * 1000  # 连接上后到开始传输时的时间
    starttransafe_time = _Curl.getinfo(_Curl.STARTTRANSFER_TIME) * 1000  # 接收到第一个字节的时间
    redirect_time = _Curl.getinfo(_Curl.REDIRECT_TIME) * 1000  # 重定向时间
    total_time = _Curl.getinfo(_Curl.TOTAL_TIME) * 1000 # 请求总时间 毫秒
    download_size = _Curl.getinfo(_Curl.SIZE_DOWNLOAD)  # 下载数据包大小
    download_speed = _Curl.getinfo(_Curl.SPEED_DOWNLOAD)  # 下载速度
    buf.close()
    print(result)
    print(http_code, dns_time, connect_time, pretransafe_time, starttransafe_time, redirect_time, total_time,
          download_size, download_speed)
    _Curl.close()

"""
get请求测试
header = [
'Content-Type:application/json; charset=utf-8'
]

fetch_api('http://xxxx', 'get', header)

post请求测试
header = [

'Content-Type:application/json; charset=utf-8'

]

data = {"userid":"%s","nickname":"zxpp","sex":"1","birthday":"2015-01-01"}
json_data = json.dumps(data)
fetch_api('http://xxxx', 'post', header=header,data=json_data)

"""

@asyncio.coroutine
def fetch_async(func, url, method, header=None, data=None):
loop = asyncio.get_event_loop()
future = loop.run_in_executor(None, func, url, method,header,data)
#response = yield from future # 因为 func 函数未返回数据,所以可以不用返回值
yield from future

header = [

'Content-Type:application/json; charset=utf-8'

]

data = {"userid":"%s","nickname":"zxpp","sex":"1","birthday":"2015-01-01"}
json_data = json.dumps(data)

tasks = [
fetch_async(fetch_api, url='http://xxxx', method='get',header=header),
fetch_async(fetch_api, url='http://xxxx', method='post', header=header,data=json_data)
]

loop = asyncio.get_event_loop()
results = loop.run_until_complete(asyncio.gather(*tasks))
loop.close()

转载于:https://blog.51cto.com/haoyonghui/2370145


http://www.niftyadmin.cn/n/4073028.html

相关文章

《中国人工智能学会通讯》——1.2 问答与智能信息获取

1.2 问答与智能信息获取 问答系统作为智能表征的研究领域,几十年来一直受到学术界的关注,国际评测 TREC 历经十余年对问答系统从几个方面进行了评测[4] 。问答系统的发展杂问题的发展过程,逐步具有了更多的智能行为特性。这个过程并不是一个单…

Ubuntu的穆斯林版 UbuntuME

Ubuntu Muslim Edition,Ubuntu穆斯林版:基于Ubuntu,加入了很多伊斯兰相关的软件。Ubuntu Muslim Edition团队最近释放了基于Ubuntu 7.10 (Gutsy Gibbon)的UbuntuME 7.10。 和标准版Ubuntu不同的是: 删除了GNOME游戏(GN…

call function

1 call递归扩展变量 本质上仍然是变量扩展,等价于$(),只不过扩展的时候带了参数,$(call xxx)返回的是xxx扩展之后的值。参数依次赋值给$(1),$(2)......,但是参数要在赋值之前完成扩展。 2 call define定义的多行变量 本质上仍然是…

Spring Boot启动原理解析

Spring Boot启动原理解析http://www.cnblogs.com/moonandstar08/p/6550758.html 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏。所以这…

Linux strace

Linux strace strace 示例 1.跟踪nginx, 看其启动时都访问了哪些文件strace -tt -T -f -e tracefile -o /data/log/strace.log -s 1024 2>&1 ./nginx2. 定位程序异常退出strace -ttf -T -p 10893 -o tmp -e traceprocess 2>&13.程序启动加载文件strace -e open,a…

Intel强势入驻 Cloudera新一轮融资9亿

在 “15核芯片数据平台,Intel软硬兼备的Hadoop战略”一文中,我们有报道过Intel发布了新型的Xeon处理器(该系列被用来支持多达32个插槽的服务器,并配有15个处理核心,每个插槽分配1.5TB内存),与 I…

IPv9(十进制网络)技术简介

IPv9(十进制网络)技术简介 根据《采用全数字码给上网的计算机分配地址的方法》发明专利实施并发展而成的“十进制网络”采用的是自主知识产权、以十进制算法(0-9)为基础的IPV9协议,并将网上计算机进行互相连接,从而达到计算机相互通信和数据传输的目的。…

工程造价行业正处大数据时代

ZDNET至顶网CIO与应用频道 01月27日 行业新闻: 大数据是继云计算、物联网之后IT产业又一次颠覆性的技术变革。云计算主要为数据资产提供了存储、访问的空间和渠道,而数据才是真正有价值的资产。建筑工程造价行业云计算紧紧结合大数据,将数据利…