python并发执行request请求

在Python中,我们可以使用requests库来发送HTTP请求,并使用threadingmultiprocessingasyncio(配合aiohttp)或concurrent.futures等库来并发执行这些请求。这里,我将为我们展示使用concurrent.futures.ThreadPoolExecutorrequests库并发执行HTTP请求的示例。

1.使用concurrent.futures.ThreadPoolExecutor并发发送请求示例

首先,我们需要安装requests库(如果还没有安装的话):

bash复制代码
​
pip install requests

然后,我们可以使用以下代码来并发地发送HTTP GET请求:

import concurrent.futures  
import requests  # 假设我们有一个URL列表  
urls = [  'http://example.com/api/data1',  'http://example.com/api/data2',  'http://example.com/api/data3',  # ... 添加更多URL  
]  # 定义一个函数,该函数接收一个URL,发送GET请求,并打印响应内容  
def fetch_data(url):  try:  response = requests.get(url)  response.raise_for_status()  # 如果请求失败(例如,4xx、5xx),则抛出HTTPError异常  print(f"URL: {url}, Status Code: {response.status_code}, Content: {response.text[:100]}...")  except requests.RequestException as e:  print(f"Error fetching {url}: {e}")  # 使用ThreadPoolExecutor并发地执行fetch_data函数  
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:  # 我们可以根据需要调整max_workers的值  future_to_url = {executor.submit(fetch_data, url): url for url in urls}  for future in concurrent.futures.as_completed(future_to_url):  url = future_to_url[future]  try:  # 通过调用future.result()来获取函数的返回值,这会阻塞,直到结果可用  # 但是请注意,这里我们只是打印结果,没有返回值,所以调用future.result()只是为了等待函数完成  future.result()  except Exception as exc:  print(f'Generated an exception for {url}: {exc}')

在这里简单解释一下这个代码示例。

(1)我们首先定义了一个URL列表,这些是我们想要并发访问的URL。

(2)然后,我们定义了一个函数fetch_data,它接收一个URL作为参数,发送GET请求,并打印响应的状态码和内容(只打印前100个字符以节省空间)。如果发生任何请求异常(例如,网络错误、无效的URL、服务器错误等),它会捕获这些异常并打印错误消息。

(3)使用concurrent.futures.ThreadPoolExecutor,我们可以轻松地并发执行fetch_data函数。我们创建了一个ThreadPoolExecutor实例,并指定了最大工作线程数(在这个例子中是5,但我们可以根据需要调整这个值)。然后,我们使用列表推导式将每个URL与一个Future对象关联起来,该对象表示异步执行的函数。

(4)最后,我们使用as_completed函数迭代所有完成的Future对象。对于每个完成的Future对象,我们调用result方法来获取函数的返回值(尽管在这个例子中我们没有使用返回值)。如果函数执行期间发生任何异常,result方法会重新引发该异常,我们可以捕获并处理它。

这个示例展示了如何使用Python的concurrent.futures模块来并发地发送HTTP请求。这种方法在IO密集型任务(如网络请求)上特别有效,因为它允许在等待IO操作完成时释放CPU资源供其他线程使用。

2.requests库并发发送HTTP GET请求的完整Python代码示例

以下是一个使用concurrent.futures.ThreadPoolExecutorrequests库并发发送HTTP GET请求的完整Python代码示例:

import concurrent.futures  
import requests  # 假设我们有一个URL列表  
urls = [  'https://www.example.com',  'https://httpbin.org/get',  'https://api.example.com/some/endpoint',  # ... 添加更多URL  
]  # 定义一个函数来发送GET请求并处理响应  
def fetch_url(url):  try:  response = requests.get(url, timeout=5)  # 设置超时为5秒  response.raise_for_status()  # 如果请求失败,抛出HTTPError异常  return response.text  # 返回响应内容,这里只是作为示例,实际使用中可能不需要返回  except requests.RequestException as e:  print(f"Error fetching {url}: {e}")  return None  # 使用ThreadPoolExecutor并发地发送请求  
def fetch_all_urls(urls):  with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:  # 使用executor.map来自动处理迭代和Future的获取  results = executor.map(fetch_url, urls)  # 处理结果(这里只是简单地打印出来)  for result in results:  if result is not None:  print(f"Fetched content from a URL (truncated): {result[:100]}...")  # 调用函数  
fetch_all_urls(urls)

在这个示例中,我们定义了一个fetch_url函数,它接收一个URL,发送GET请求,并返回响应内容(或在出错时返回None)。然后,我们定义了一个fetch_all_urls函数,它使用ThreadPoolExecutor并发地调用fetch_url函数,并将结果收集在一个迭代器中。最后,我们遍历这个迭代器,并打印出每个成功获取到的响应内容(这里只打印了前100个字符作为示例)。

请注意,我们在requests.get中设置了一个超时参数(timeout=5),这是为了防止某个请求因为网络问题或其他原因而无限期地等待。在实际应用中,根据我们的需求调整这个值是很重要的。

此外,我们还使用了executor.map来自动处理迭代和Future的获取。executor.map函数会返回一个迭代器,它会产生fetch_url函数的返回值,这些值在函数完成后会自动从相应的Future对象中提取出来。这使得代码更加简洁,并且减少了显式处理Future对象的需要。

3.如何在Python中实现并发编程

在Python中实现并发编程,主要有以下几种方式:

(1)使用threading模块 threading模块提供了多线程编程的API。Python的线程是全局解释器锁(GIL)下的线程,这意味着在任意时刻只有一个线程能够执行Python字节码。然而,对于I/O密集型任务(如网络请求),多线程仍然可以通过并发地等待I/O操作来提高性能。

示例:

import threading  
import requests  def fetch_url(url):  try:  response = requests.get(url)  response.raise_for_status()  print(f"URL: {url}, Status Code: {response.status_code}")  except requests.RequestException as e:  print(f"Error fetching {url}: {e}")  threads = []  
for url in urls:  t = threading.Thread(target=fetch_url, args=(url,))  threads.append(t)  t.start()  # 等待所有线程完成  
for t in threads:  t.join()

(2)使用multiprocessing模块 multiprocessing模块提供了跨多个Python解释器的进程间并行处理。这对于CPU密集型任务特别有用,因为每个进程都有自己的Python解释器和GIL,可以充分利用多核CPU的并行处理能力。

示例:

from multiprocessing import Pool  
import requests  def fetch_url(url):  try:  response = requests.get(url)  response.raise_for_status()  return f"URL: {url}, Status Code: {response.status_code}"  except requests.RequestException as e:  return f"Error fetching {url}: {e}"  with Pool(processes=4) as pool:  # 设定进程池的大小  results = pool.map(fetch_url, urls)  for result in results:  print(result)

(3)使用asyncio模块(针对异步I/O) asyncio是Python 3.4+中引入的用于编写单线程并发代码的库,特别适合编写网络客户端和服务器。它使用协程(coroutine)和事件循环(event loop)来管理并发。

示例(使用aiohttp库进行异步HTTP请求):

import asyncio  
import aiohttp  async def fetch_url(url, session):  async with session.get(url) as response:  return await response.text()  async def main():  async with aiohttp.ClientSession() as session:  tasks = []  for url in urls:  task = asyncio.create_task(fetch_url(url, session))  tasks.append(task)  results = await asyncio.gather(*tasks)  for result, url in zip(results, urls):  print(f"URL: {url}, Content: {result[:100]}...")  # Python 3.7+ 可以使用下面的方式运行主协程  
asyncio.run(main())

注意:asyncio.run()是在Python 3.7中引入的,用于运行顶层入口点函数。在Python 3.6及以下版本中,我们需要自己设置和运行事件循环。

(4)使用concurrent.futures模块 concurrent.futures模块提供了高层次的接口,可以轻松地编写并发代码。它提供了ThreadPoolExecutor(用于线程池)和ProcessPoolExecutor(用于进程池)。

前面已经给出了ThreadPoolExecutor的示例,这里不再重复。ProcessPoolExecutor的用法与ThreadPoolExecutor类似,只是它是基于进程的。

选择哪种并发方式取决于我们的具体需求。对于I/O密集型任务,多线程或异步I/O通常是更好的选择;对于CPU密集型任务,多进程可能是更好的选择。此外,异步I/O通常比多线程具有更好的性能,特别是在高并发的网络应用中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

淘宝店铺商家订单API-接入ERP,多平台订单同步的利器

淘宝开放平台给商家们提供了丰富的API,以方便大家扩展业务流程。但是需要调用这些API,商家们要提交资质审核,审核条件也是很严格的。第三方数据公司的存在可以为大家解决这个问题。 custom-自定义API操作 请求参数 请求参数:ap…

线上数据线下使用的数据处理方法:数据脱敏

在信息技术领域,敏感数据是指那些一旦被泄露或滥用,可能会对个人隐私、企业利益或国家安全造成严重影响的信息。这类数据通常包括但不限于: 个人信息:如姓名、身份证号、联系方式、住址等。 财务信息:如银行账户、信用卡号、交易记录等。 商业机密:如产品设计、市场策略、…

告别手机废片,这几款APP让你随手出大片

想象一下,你站在壮丽的风景前,满怀期待地按下手机相机的快门,但得到的照片却总与眼前美景有所差距。 是不是觉得手机的原生相机有时候并不那么“给力”? 今天,我们就来一起探讨一下手机原生相机的不足之处,…

web前端课程大作业-高校学生事务中心

文章目录 概述代码页面截图代码链接 概述 仿制高校的学生事务中心&#xff0c;一个登录和注册页面 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" conten…

网约车停运损失费:1、事故经过

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…

用ChatGPT快速打造一个专业WordPress网站

作为一个使用HostEase多年的老用户&#xff0c;我想和大家分享一下如何利用HostEase和ChatGPT快速构建一个WordPress网站的经验。这不仅仅是一个简单的操作步骤&#xff0c;更是一次从零到有的实战经历。希望我的分享能给你们带来一些实用的帮助。 获取主机服务和域名 首先&a…

ModuleNotFoundError: No module named ‘gdal‘

第一步检查gdal包是否正确安装&#xff1a; conda list 已经安装显示如下 若查找不到&#xff1a;请按照此说明步骤进行安装&#xff1a;ModuleNotFoundError: No module named ‘osgeo‘_modulenotfounderror: no module named osgeo-CSDN博客 第二步&#xff1a;检查是否可以…

HistoQC|病理切片的质量控制工具

小罗碎碎念 这期推文介绍的内容&#xff0c;我相信研究病理组学的人&#xff0c;一定都非常熟悉——HistoQC——病理切片的质量控制。 之前写过Hover Net系列的推文&#xff0c;反响还可以&#xff0c;但是Hover Net是用于细胞核检测和分类的&#xff0c;直接从这里开始还不够系…

Win11:系统属性,由于启动计算机时出现了页面文件配置问题,Windows 在你的计算机上创建了一个临时页面文件。

Win11&#xff1a;系统属性&#xff0c;由于启动计算机时出现了页面文件配置问题&#xff0c;Windows 在你的计算机上创建了一个临时页面文件。所有磁盘驱动器的总页面文件大小可能稍大于你所指定的大小。确定。 解决方法&#xff1a;

说下IPython

IPython 是一个交互式计算环境&#xff0c;旨在增强 Python 编程体验。它提供了强大的工具和灵活的环境&#xff0c;支持科学计算、数据分析和开发工作。 1. IPython 的基本功能 **1.1. 交互式 Shell** IPython 提供了一个功能强大的交互式 shell&#xff0c;比标准的 Python…

Vue - HTML基础学习

一、元素及属性 1.元素 <p>我是一级标题</p>2.嵌套元素 把元素放到其他元素之中——这被称作嵌套。 <p>我是<strong>一级</strong>标题</p>3.块级元素 块级元素在页面中以块的形式展现&#xff0c;会换行&#xff0c;可嵌套内联元素。 …

【2024】LeetCode HOT 100——贪心算法

目录 1. 买卖股票的最佳时机1.1 C++实现1.2 Python实现1.3 时空分析2. 跳跃游戏2.1 C++实现2.2 Python实现2.3 时空分析3. 跳跃游戏 II3.1 C++实现3.2 Python实现3.3 时空分析4. 划分字母区间4.1 C++实现4.2 Python实现4.3 时空分析1. 买卖股票的最佳时机 🔗 原题链接:121. …

「漏洞复现」申瓯通信 在线录音管理系统 download 任意文件读取漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

Echarts 图表添加点击事件跳转页面,但只有图表部分点击才会跳转页面,坐标轴,区域缩放等点击不跳转。

默认的点击事件是这样的&#xff1a; myChart.on(click, function (param) {console.log(param) }) 这个事件需要点击具体图形才会触发&#xff0c;例如我上面的图&#xff0c;想选择a柱子&#xff0c;就需要明确点击到柱体才行&#xff0c;明显不符合正常的预期&#xff0c;正…

ROS2安装

1.安装vmware虚拟机 2.添加虚拟机安装Ubuntu系统 3.启动虚拟机 4.安装必要环境变量、组件 sudo apt update && sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 export LANGen_US.UTF-8 sudo a…

【408考点之数据结构】二叉树的遍历及线索二叉树

二叉树的遍历及线索二叉树 一、二叉树的遍历 二叉树的遍历是指按照一定的顺序访问二叉树中所有节点。常见的遍历方法有前序遍历&#xff08;Preorder Traversal&#xff09;、中序遍历&#xff08;Inorder Traversal&#xff09;、后序遍历&#xff08;Postorder Traversal&a…

浮点数原理与`BigDecimal`实践应用

浮点数原理与BigDecimal实践应用 问题引入&#xff1a; 浮点数 浮点数如何表示数字&#xff1f; 浮点数采用科学计数法表示一个数字&#xff0c;具体格式为&#xff1a; V ( − 1 ) S ∗ M ∗ R E V (-1)^S * M * R^E V(−1)S∗M∗RE S&#xff1a;符号位&#xff0c;取…

什么是 HTTP Range请求(范围请求)

HTTP Range&#xff1a;范围请求 Range 头是在 HTTP/1.1 协议中新增的一个请求头。包含 Range 头的请求通常称为范围请求&#xff0c;因为 Range 头允许服务器只发送部分响应到客户端&#xff0c;它是下载工具&#xff08;例如迅雷&#xff09;实现多线程下载的核心所在&#…

vue3+crypto-js插件实现对密码加密后传给后端

最近在做项目的过程中又遇到了一个新的问题&#xff0c;在实现后端管理系统的个人信息页面中&#xff0c;涉及到修改密码的功能&#xff0c;刚开始我直接通过传参的方式将修改的密码传入给后端&#xff0c;可是后端说需要将原密码、新密码以及确认密码都进行加密处理&#xff0…

大模型技术的应用场景

大模型技术&#xff08;Large Language Model&#xff0c;LLM&#xff09;是指具有大量参数和训练数据的神经网络模型&#xff0c;它能够学习语言的统计规律&#xff0c;并生成与人类书写的文本相似的文本。大模型技术在近年来取得了重大进展&#xff0c;并开始在各种领域得到应…