# -*- coding: utf-8 -*-
# @Time : 2019-12-09 10:00
# @Author : cxa
# @File : demo.py
# @Software: PyCharm
from requests_futures.sessions import FuturesSession
from concurrent.futures import as_completed
from lxml import html
import time url = ["http://www.baidu.com", "http://www.163.com", "http://www.google.com", "http://www.cnblogs.com/c-x-a"] def get_node(source, x=".//head/title//text()"):
root = html.fromstring(source)
node = root.xpath(x)
return node def response_hook(resp, *args, **kwargs):
start = time.time()
resp.encoding = resp.apparent_encoding
resp.data = resp.text
resp.code = resp.status_code
resp.headers = resp.headers
resp.elapsed = time.time() - start def get_req():
with FuturesSession(max_workers=4) as session:
futures = [session.get(i, hooks={"response": response_hook}) for i in url]
for future in as_completed(futures):
resp = future.result()
print("状态码", resp.code)
print("标题", get_node(resp.data)[0])
print("耗时", resp.elapsed)
print("="*30) if __name__ == '__main__':
get_req()

修改之后

from requests_futures.sessions import FuturesSession
from concurrent.futures import as_completed
from lxml import html
import time url = ["http://www.baidu.com", "http://www.163.com", "http://www.google.com", "http://www.cnblogs.com/c-x-a"] class MySession(FuturesSession): def request(self, method, url, hooks=None, *args, **kwargs):
start = time.time()
if hooks is None:
hooks = {} def response_hook(resp, *args, **kwargs):
resp.encoding = resp.apparent_encoding
resp.data = resp.text
resp.code = resp.status_code
resp.headers = resp.headers
resp.elapsed = time.time() - start try:
if isinstance(hooks['response'], (list, tuple)):
hooks['response'].insert(0, response_hook)
else:
hooks['response'] = [response_hook, hooks['response']]
except KeyError:
hooks['response'] = response_hook return super(MySession, self).request(method, url, hooks=hooks, *args, **kwargs) def get_node(source, x=".//head/title//text()"):
root = html.fromstring(source)
node = root.xpath(x)
return node def get_req():
with MySession(max_workers=4) as session:
futures = [session.get(i) for i in url]
for future in as_completed(futures):
resp = future.result()
print("状态码", resp.code)
print("标题", get_node(resp.data)[0])
print("耗时", resp.elapsed)
print("=" * 30) if __name__ == '__main__':
get_req()

Python并发请求之requests_future模块使用的更多相关文章

  1. Python并发复习2 - 多线程模块threading

    一.多线程的调用 threading 模块建立在thread 模块之上.thread模块以低级.原始的方式来处理和控制线程,而threading 模块通过对thread进行二次封装, 提供了更方便的a ...

  2. Python并发复习4- concurrent.futures模块(线程池和进程池)

    Python标准库为我们提供了threading(多线程模块)和multiprocessing(多进程模块).从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提 ...

  3. Python并发复习3 - 多进程模块 multiprocessing

    python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了非常好用的多进程包multiprocessing,只需要定 ...

  4. python 并发编程 基于gevent模块 协程池 实现并发的套接字通信

    基于协程池 实现并发的套接字通信 客户端: from socket import * client = socket(AF_INET, SOCK_STREAM) client.connect(('12 ...

  5. python 并发编程 基于gevent模块实现并发的套接字通信

    之前线程池是通过操作系统切换线程,现在是程序自己控制,比操作系统切换效率要高 服务端 from gevent import monkey;monkey.patch_all() import geven ...

  6. Python并发复习1 - 多线程

    一.基本概念 程序: 指令集,静态, 进程: 当程序运行时,会创建进程,是操作系统资源分配的基本单位 线程: 进程的基本执行单元,每个进程至少包含一个线程,是任务调度和执行的基本单位 > 进程和 ...

  7. python 并发编程 协程 目录

    python 并发编程 协程 协程介绍 python 并发编程 协程 greenlet模块 python 并发编程 协程 gevent模块 python 并发编程 基于gevent模块实现并发的套接字 ...

  8. python网页请求urllib2模块简单封装代码

    这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...

  9. python web中的并发请求

    python web可以选择django,也可以选择flask,它们的原理差不多.flask比较轻量,下面写一段flask程序来说明python web对并发请求的处理. app.py import ...

随机推荐

  1. 嵌入式Web服务器boa在ARM平台的移植步骤

    1.下载http://www.boa.org/ 2.解压tar xzf boa-0.94.13.tar.gz 3.编译cd boa-0.94.13/src./configure 生成了makefile ...

  2. 渐进增强(progressive enhancement)、优雅降级(graceful degradation)

    渐进增强 progressive enhancement: 针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果.交互等改进和追加功能达到更好的用户体验. 优雅降级 grace ...

  3. APS应用案例|纽威阀门实现高效排产

    企业背景: 苏州纽威阀门股份有限公司(下文简称:纽威阀门)成立于1997年,总部设在江苏苏州.自成立以来一直致力于工业阀门的研发与制造,以为客户提供全套工业阀门解决方案为目标.纽威阀门通过企业的努力发 ...

  4. 为 Linux 应用程序编写 DLL

    插件和 DLL 通常是用来无须编写整个新应用程序而添加功能的极好方法. 在 Linux 中,插件和 DLL 是以动态库形式实现的. 电子商务顾问兼设计师 Allen Wilson 介绍了动态库,并且向 ...

  5. 避免SQL全表模糊查询查询 下载文件时-修改文件名字

    避免SQL全表模糊查询查询   1.模糊查询效率很低: 原因:like本身效率就比较低,应该尽量避免查询条件使用like:对于like %...%(全模糊)这样的条件,是无法使用索引的,全表扫描自然效 ...

  6. VS code key shortcuts for windows

    mac上的快捷键,尽量是选择像我用vs studio上靠近. ctrl+K+S: 显示快捷键列 ctrl+shift+p: 系统配置命令行 ctrl+p:项目中文件列表,选择文件 Alt+M:当前文件 ...

  7. postgresql9.5编译安装体验

    实验环境: centos7.6 pgsql9.5 源码编译安装 实验目的: 体验源码编译安装pgsql 01.download https://ftp.postgresql.org/pub/sourc ...

  8. go语言学习笔记(一):*和&的区别

    2018年04月15日 16:19:43 liudashuang2017 阅读数 2948更多 分类专栏: go   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文 ...

  9. pandas的pivot_table

    参考文献: [1]pivot_table

  10. Java Spring Boot 一些调试技巧

    配置文件的管理 有的时候我们希望开发环境和测试环境的配置文件放在一起可以快速切换 spring boot 为我们提供了很方便的的选项 在 application.properties 中只需要添加属性 ...