python运行配置不正确_如何使用Python3.5并行执行多个web请求(不适用aiohttp

2023-10-30

阅读时间 8 分钟

> 作者的生产环境刚从2.6升级到3.5.0,但满足不了aiohttp的最低版本需求。所以在有了这篇文章,如何改造代码,充分利用python3.5 asyncio提供的异步功能。原文链接

近日IT部门最终将我们工作环境的分布式Python版本升级到了3.5.0。这对从2.6版本来说是一次巨大的升级,但依然有些遗憾。3.5.0 不能满足一些库的最小版本需求,这其中就包括aiohttp。

尽管有这些限制,我依然需要写脚本从我们的API获取数以百计的csv文件,然后处理数据。Python本身并不想NodeJS那样基于事件驱动和原生异步,但这并不妨碍Python 也能实现一样的功能。这篇文档将详细介绍我如何学习异步操作,并列出它的优势。

声明: 如果你有更高的版本(3.5.2+),强烈推荐你使用aiohttp。这是个非常健壮的库, 特别适合解决这类问题。网上也有很多关于她的教程。

假设

作如下假设:

> * 熟悉Python和它的语法

> * 熟悉基础的网络请求

> * 知道异步执行的概念

开始

安装requests

$ python -m pip install requests

没有权限可以做如下安装

$ python -m pip install requests --user

错误的做法:同步请求

为了体现并行的好处,先看看同步的做法。我大概描述一下代码将要做什么。我们要执行一个能获取csv文件的GET请求,测量读取其中文本的时间。

在说明一下,我们将用requests 库里 Session对象,执行GET请求。

首先,需要一个方法执行web请求:

def fetch(session, csv):

base_url = "https://people.sc.fsu.edu/~jburkardt/data/csv/"

with session.get(base_url + csv) as response:

data = response.text

if response.status_code != 200:

print("FAILURE::{0}".format(url))

# Return .csv data for future consumption

return data

这个函数使用Session对象和csv名字,执行网络请求,然后返回response里的文本内容。

下面,我们需要一个函数遍历文件列表,然后去请求,统计执行请求的时间。

from timeit import default_timer()

def get_data_synchronous():

csvs_to_fetch = [

"ford_escort.csv",

"cities.csv",

"hw_25000.csv",

"mlb_teams_2012.csv",

"nile.csv",

"homes.csv",

"hooke.csv",

"lead_shot.csv",

"news_decline.csv",

"snakes_count_10000.csv",

"trees.csv",

"zillow.csv"

]

with requests.Session() as session:

print("{0:<30} {1:>20}".format("File", "Completed at"))

# Set any session parameters here before calling `fetch`

# For instance, if you needed to set Headers or Authentication

# this can be done before starting the loop

total_start_time = default_timer()

for csv in csvs_to_fetch:

fetch(session, csv)

elapsed = default_timer() - total_start_time

time_completed_at = "{:5.2f}s".format(elapsed)

print("{0:<30} {1:>20}".format(csv, time_completed_at))

这个函数创建了一个Session对象,然后遍历csvs_to_fetch里的每个文件。一旦fetch操作结束, 就将计算下载时间,并以易读的格式展示。

最后main函数调用:

def main():

# Simple for now

get_data_synchronous()

main()

同步执行的完整代码

import requests

from timeit import default_timer

def fetch(session, csv):

base_url = "https://people.sc.fsu.edu/~jburkardt/data/csv/"

with session.get(base_url + csv) as response:

data = response.text

if response.status_code != 200:

print("FAILURE::{0}".format(url))

# Return .csv data for future consumption

return data

def get_data_synchronous():

csvs_to_fetch = [

"ford_escort.csv",

"cities.csv",

"hw_25000.csv",

"mlb_teams_2012.csv",

"nile.csv",

"homes.csv",

"hooke.csv",

"lead_shot.csv",

"news_decline.csv",

"snakes_count_10000.csv",

"trees.csv",

"zillow.csv"

]

with requests.Session() as session:

print("{0:<30} {1:>20}".format("File", "Completed at"))

# Set any session parameters here before calling `fetch`

# For instance, if you needed to set Headers or Authentication

# this can be done before starting the loop

total_start_time = default_timer()

for csv in csvs_to_fetch:

fetch(session, csv)

elapsed = default_timer() - total_start_time

time_completed_at = "{:5.2f}s".format(elapsed)

print("{0:<30} {1:>20}".format(csv, time_completed_at))

def main():

# Simple for now

get_data_synchronous()

main()

结果:

多亏了Python3 asyncio, 通过它我们可以大幅度提高性能。

正确的解决办法: 一次执行多个异步请求

为了能起作用,我们要先重做现有的代码。从fetch开始:

import requests

from timeit import default_timer

# We'll need access to this variable later

START_TIME = default_timer()

def fetch(session, csv):

base_url = "https://people.sc.fsu.edu/~jburkardt/data/csv/"

with session.get(base_url + csv) as response:

data = response.text

if response.status_code != 200:

print("FAILURE::{0}".format(url))

# Now we will print how long it took to complete the operation from the

# `fetch` function itself

elapsed = default_timer() - START_TIME

time_completed_at = "{:5.2f}s".format(elapsed)

print("{0:<30} {1:>20}".format(csv, time_completed_at))

return data

下一步, 改造get_data为异步函数

import asyncio

from timeit import default_timer

from concurrent.futures import ThreadPoolExecutor

async def get_data_asynchronous():

csvs_to_fetch = [

"ford_escort.csv",

"cities.csv",

"hw_25000.csv",

"mlb_teams_2012.csv",

"nile.csv",

"homes.csv",

"hooke.csv",

"lead_shot.csv",

"news_decline.csv",

"snakes_count_10000.csv",

"trees.csv",

"zillow.csv"

]

print("{0:<30} {1:>20}".format("File", "Completed at"))

# Note: max_workers is set to 10 simply for this example,

# you'll have to tweak with this number for your own projects

# as you see fit

with ThreadPoolExecutor(max_workers=10) as executor:

with requests.Session() as session:

# Set any session parameters here before calling `fetch`

# Initialize the event loop

loop = asyncio.get_event_loop()

# Set the START_TIME for the `fetch` function

START_TIME = default_timer()

# Use list comprehension to create a list of

# tasks to complete. The executor will run the `fetch`

# function for each csv in the csvs_to_fetch list

tasks = [

loop.run_in_executor(

executor,

fetch,

*(session, csv) # Allows us to pass in multiple arguments to `fetch`

)

for csv in csvs_to_fetch

]

# Initializes the tasks to run and awaits their results

for response in await asyncio.gather(*tasks):

pass

现在的代码创建了多个线程,为每个csv文件执行fetch函数进行下载。

最后,我们的mian函数为了正确的初始化异步函数,也需要稍微做些修改。

def main():

loop = asyncio.get_event_loop()

future = asyncio.ensure_future(get_data_asynchronous())

loop.run_until_complete(future)

main()

再执行下,看看结果:

略微修改后,12个文件的下载时间3.43s vs 10.84s。下载时间减少了近70%。

import requests

import asyncio

from concurrent.futures import ThreadPoolExecutor

from timeit import default_timer

START_TIME = default_timer()

def fetch(session, csv):

base_url = "https://people.sc.fsu.edu/~jburkardt/data/csv/"

with session.get(base_url + csv) as response:

data = response.text

if response.status_code != 200:

print("FAILURE::{0}".format(url))

elapsed = default_timer() - START_TIME

time_completed_at = "{:5.2f}s".format(elapsed)

print("{0:<30} {1:>20}".format(csv, time_completed_at))

return data

async def get_data_asynchronous():

csvs_to_fetch = [

"ford_escort.csv",

"cities.csv",

"hw_25000.csv",

"mlb_teams_2012.csv",

"nile.csv",

"homes.csv",

"hooke.csv",

"lead_shot.csv",

"news_decline.csv",

"snakes_count_10000.csv",

"trees.csv",

"zillow.csv"

]

print("{0:<30} {1:>20}".format("File", "Completed at"))

with ThreadPoolExecutor(max_workers=10) as executor:

with requests.Session() as session:

# Set any session parameters here before calling `fetch`

loop = asyncio.get_event_loop()

START_TIME = default_timer()

tasks = [

loop.run_in_executor(

executor,

fetch,

*(session, csv) # Allows us to pass in multiple arguments to `fetch`

)

for csv in csvs_to_fetch

]

for response in await asyncio.gather(*tasks):

pass

def main():

loop = asyncio.get_event_loop()

future = asyncio.ensure_future(get_data_asynchronous())

loop.run_until_complete(future)

main()

希望你喜欢这篇文章,并将这些技术应用到必须使用旧版本Python的项目。

尽管Python没有简单的async / await 模式,但要取得类似的结果,也并不难。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python运行配置不正确_如何使用Python3.5并行执行多个web请求(不适用aiohttp 的相关文章

  • MySQL执行器与存储引擎是怎么交互的

    体系结构 1 连接器 2 查询缓存 3 分析器 4 优化器 多个索引 选择哪个索引 join的顺序 5 执行器 调用存储引擎接口获取满足条件的第一行记录 调用存储引擎接口获取满足条件的下一行记录 6 存储引擎 索引下推 假设现子表T有字段
  • c++泛型算法扩展和迭代器、反向迭代器

    cout lt lt 插入迭代器 lt lt endl back inserter 创建一个使用push back的迭代器 front inserter 创建一个使用push front的迭代器 inserter 创建一个使用insert的
  • bee-box

    这篇博客就是为了记下bee box做题过程 随便记记 免得忘了 安装 先去官网下载了 然后分个新的盘单独放进去 打开虚拟机 双击bee box vmx就能安装了 打开里面的火狐会自动跳去一个登录界面 默认账号和密码是bee bug 登录然后
  • GitHub 源代码被泄露了...

    阅读本文大概需要 4 分钟 来自量子位 GitHub 忽然 开源 了自己代码的一部分 还将它放在了 GitHub 上 事件起因是这样的 TypeScript 的开发者 Resynth 忽然 Po 了篇文章 表示代码托管服务 GitHub 的
  • 【牛客网OJ题】不要二

    题目描述 二货小易有一个WH的网格盒子 网格的行编号为 0 H 1 网格的列编号为0 W 1 每个格子至多可以放一块蛋糕 任意两块蛋糕的欧几里得距离不能等于2 对于两个格子坐标 x1 y1 x2 y2 的欧几里得距离为 x1 x2 x1 x
  • spring注解:@Autowired、@Qualifier、@Primary

    Autowired 默认情况下 Autowired 按类型装配 Spring Bean 如果容器中有多个相同类型的 bean 则框架将抛出 NoUniqueBeanDefinitionException 以提示有多个满足条件的 bean 进
  • Raki的读paper小记:SELF-INSTRUCT: Aligning Language Models with Self-Generated Instructions

    Abstract Introduction Related Work 研究任务 改进大模型遵循指令的能力 SELF INSTRUCT提供了一种几乎无需注释的方法来使预训练语言模型与指令对齐 已有方法和相关工作 许多研究提出使用语言模型进行数
  • Vue 2.0双向绑定原理的实现

    Object defineProperty方法 vue js是采用数据劫持结合发布 订阅者模式的方式 通过Object defineProperty 来劫持各个属性的setter getter 在数据变动时发布消息给订阅者 触发相应的监听回
  • 分布式系统的正确性验证方法

    分布式系统的正确性验证方法 1 Jepsen框架 Jepsen是一个开源的分布式一致性验证框架 可用于验证分布式数据库 分布式消息队列 分布式协调系统 Jepsen探索特定故障模式下分布式系统是否满足一致性 Jepsen框架是一个
  • 用于构建 RESTful Web 服务的多层架构

    文章出自 Bruce Sun Java 架构师 IBM 简介 由于它简便 轻量级以及通过 HTTP 直接传输数据的特性 RESTful Web 服务成为基于 SOAP 服务的一个最有前途的替代方案 在本文中 我们将概述 REST 和 RES
  • 分享63个最常见的前端面试题及其答案

    在前端面试中 各种面试题都会遇到 因此 今天我们整理了60 比较常见繁杂的面试题 希望这些面试题能够对你有所帮助 当然 这些面试题的答案都不是标准答案 只是对答案做了一个简介明了的说明 希望可以快速帮助你梳理重点核心内容 这些答案可以作为参
  • 密码破解---实验八:Windows本地破解用户口令

    目录 一 实验目的及要求 二 实验原理 1 Windows NT 系统密码存储的基本原理 2 SAM的导出方法 三 实验环境 四 实验步骤及内容 五 实验总结 六 分析与思考 一 实验目的及要求 1 了解Windows2000 XP Ser
  • apache服务详解

    APACHE服务 Apache HTTP Server 简称Apache 是Apache软件基金会的一个开放源码的网页服务器 可以在大多数计算机操作系统中运行 由于其多平台和安全性被广泛使用 是最流行的Web服务器端软件之一 它快速 可靠并
  • [机缘参悟-72]:深度思考-人生自省的四重境界:不觉、自觉、觉他、圆满

    前言 人有觉 自觉 觉他 觉行圆满 阐述了人生自省的三重状态 把 不觉 也放入其中 作为在芸芸众生的起点 福 看天下 众生皆苦 从 福 家来看 身体的劳作都算不上真正的苦 福 学中 对于 苦 有不同的认识 可以总结出人世间八大痛苦 此为众生
  • SpringSecurity源码分析(一) SpringBoot集成SpringSecurity即Spring安全框架的加载过程

    Spring Security是一个强大的并且高度可定制化的访问控制框架 它基于spring应用 Spring Security是聚焦于为java应用提供授权和验证的框架 像所有的spring项目一样 Spring Security真正的强
  • osError cannot load library‘Libsndfile.dll‘:error 0x7e

    解决 1 在所给报错路径下 在site packages文件夹下自己创建一个命名为 soundfile data的文件夹 2 下载libsndfile64bit dll文件 下载地址为https github com bastibe lib
  • MySQL8 详细安装步骤 【附安装包】

    一 准备安装包 方式1 云盘 下载 MySQL8 百度云盘下载地址 地址永久有效 链接 https pan baidu com s 1s BH7uizzuwr8P QAJzH4w 提取码 e2xf 方式2 官网下载 MySQL官网下载安装包
  • part2:服务器接收企业微信用户消息

    流程概括 PART1 阿里云服务器配置 购买并配置阿里云服务器 这里选择的是ESC云服务器 centOS7操作系统 配置安全组 开放端口 允许外部访问你的服务器 购买域名并解析到服务器端 申请ssl证书并下载 PART2 远程操作服务器 下
  • js事件 及 事件对象event

    事件类型 鼠标事件 click 点击 dblclick双击 mouseover mouseenter鼠标移入 mouseout mouseleave鼠标离开 onmouseover和onmouseenter的区别 onmouseout和on

随机推荐

  • TCP连接+数据库项目之零碎知识点

    服务器 绑定数据库 和客户端建立连接及传输需要建立的注意点 1 如果要发送结构体中的数据 那么struct中不能使用char 或者string类 因为char 本质上是指针 而指针是通过操作地址来查找数据的 所以服务器接收到的数据只有4个字
  • 2022年最新Vue+electron项目创建

    一 前言 大多数文章都停留在electron vue中 但是这个库不怎么更新了 最近的更新是九月前 看了很多文章都换其他的工具来构建了 这里推荐GITHUB一个大佬写的基于vue cli的插件 构建项目非常简单 插件的GITHUB源代码 话
  • String 类的基本用法及String 类的常见操作

    作者 月亮嚼成星 博客主页 月亮嚼成星 的博客主页 专栏 Java SE基础 工欲善其事必先利其器 给大家介绍一款超牛的斩获大厂offer利器 牛客网 点击免费注册和我一起刷题吧 字符串常见三种构造方式 public class Test
  • STM32-RS485

    RS485 1 RS485基本介绍 1 1RS485特点 1 接口电平低 逻辑 1 用压差为 2 6 V表示 逻辑 0 用压差 2 6 V表示 2 传输速率高 10m时 最高速率可达35Mbps 在1200m时 速率可达100Kbps 3
  • NSSCTF之Misc篇刷题记录⑨

    NSSCTF之Misc篇刷题记录 GKCTF 2021 签到 NISACTF 2022 bmpnumber 领航杯江苏省赛 2021 签到题 鹤城杯 2021 Misc2 鹤城杯 2021 A MISC GXYCTF 2019 CheckI
  • view的getWidth() getHeight() 总是返回0 的几种解决方法

    当我们在oncreate 调用 getwith 与 getheigh 时返回0 的原因是我们的view 在此时还没有绘制出来 不光在oncreate Activity生命周期中 onStart onResume onCreate都不是真正v
  • 【PYTHON】绘制热力图SEABORN.HEATMAP

    目录 一 参数详解 二 颜色参数 cmap 三 个性化设置 四 代码 更多python资料 源码 教程皆可点击文章下方名片获取此处跳转 一 参数详解 seaborn heatmap seaborn heatmap data vmin Non
  • 线程的6种状态

    原文链接 线程的6种状态 编程屋 线程中的6中状态 1 初始状态 NEW 线程未开始的状态 线程刚刚创建出来 还没有调用start方法 线程就进入了初始状态 2 运行时状态 RUNNABLE 包括了线程状态中的Running和Ready 也
  • 深度学习福利 免费GPU服务器算力资源开放申请!

    羊毛来了 薅起来 没什么门槛 自己申请一下就拿到了免费的GPU算力资源 说实话用起来方便 而且有问题的话 官方技术也给力 很快就会回复帮忙解决 机型配置都还行 之前平台首推的是Iesla T4 2080TI这两款机型 最近上架了新机型P10
  • selenium实现原理

    Selenium 1 0 的工作原理 Selenium 1 0 又称Selenium RC RC是Remote Control的缩写 Selenium RC利用的原理 JavaScript代码可以方便的获取页面上的任意元素并执行各种操作 但
  • 基于深度学习的关系抽取

    http www cipsc org cn qngw p 890 题目 基于深度学习的关系抽取 PDF 作者 林衍凯 刘知远 清华大学 引言 信息抽取旨在从大规模非结构或半结构的自然语言文本中抽取结构化信息 关系抽取是其中的重要子任务之一
  • 【算法和数据结构】LeetCode题解

    文章目录 一 数组 二 链表 三 哈希表 四 字符串 五 栈和队列 六 二叉树 七 回溯算法 八 贪心算法 九 动态规划 十 单调栈 十一 图论 十二 其他 本篇文章记录博主刷LeetCode题的题解和思路 如果对博主的其他文章感兴趣 可以
  • 【CentOS7安装Nginx】

    CentOS7安装Nginx 1 下载软件包 wget http nginx org download nginx 1 20 2 tar gz 1 2 安装依赖 yum y install gcc pcre devel zlib devel
  • .net core 3.1 连接 EF MySQL

    1 创建新项目 ASP NET Core Web 应用程序 2 3 右键项目 管理 NuGet 程序包 N 4 搜索 Pomelo EntityFrameworkCore MySql 安装 5 在appsettings json文件添加 数
  • 2018年总结:向死而生,为爱而活——忆编程青椒的戎马岁月

    悟以往已不见 知来者之可追 2018年就要这样过去了 这已是我在CSDN写下的第六篇年终总结 回首 2013年我感悟到 一万年太久 只争朝夕 2014年本科毕业 我抒写下 回忆大学四年的得与失 2015年我放弃北上广 选择回到贵州 感叹 无
  • 2021-8-14-Deep MR to CT Synthesis using Unpaired Data(MICCAI Workshop 2017)-有代码

    CycleGAN的代码链接 https github com junyanz pytorch CycleGAN and pix2pix 这篇文章是做什么的 MR模态合成CT模态 是否需要数据配准 不需要 是基于2D还是3D sagittal
  • 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。问总共有多少条不同的路径?

    var unique function m n var arr for var i 0 i lt n i arr push for var row 0 row lt n row arr row 0 1 for var col 0 col l
  • 使用国内镜像源安装windows下python的pip包

    我们安装各类pip的包时 网速会很慢 可能会下载很久 1 我们可以使用镜像源去下载 whl文件再安装 这个方式有可能也会花很长时间 2 使用国内源pip安装 推荐 这个方式是我平时使用的方式 速度比较块 国内源 清华 https pypi
  • Win10 系统下 VisualStudio2019 配置点云库 PCL1.11.1

    目录 一 下载PCL1 11 1 二 安装PCL1 11 1 三 设置VS2019 四 配置PCL1 11 1 五 测试代码 六 附录 获取附加依赖项 一 下载PCL1 11 1 Github下载地址 PCL 1 11 1 下载红框内的两个
  • python运行配置不正确_如何使用Python3.5并行执行多个web请求(不适用aiohttp

    阅读时间 8 分钟 gt 作者的生产环境刚从2 6升级到3 5 0 但满足不了aiohttp的最低版本需求 所以在有了这篇文章 如何改造代码 充分利用python3 5 asyncio提供的异步功能 原文链接 近日IT部门最终将我们工作环境