1.1.1. 前期环境准备和基础知识

安装:

pip3 install aiohttp

pip3 install grequests

pip3 install wheel

pip3 install scrapy

注意:

windows上scrapy依赖 https://sourceforge.net/projects/pywin32/files/

安装Twisted

a. http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted,

b. 下载:Twisted-17.1.0-cp35-cp35m-win_amd64.whl

c. 进入文件所在目录

d. pip3 install Twisted-17.1.0-cp35-cp35m-win_amd64.whl

 

实现IO操作的方式

 

为什么需要异步请求呢?

如果是正常的请求,一个请求结束后才能开启下一个请求[串行请求],如果期间有一个请求一次,则后面的请求都会终止。

如果是类似多线程的异步请求,则由多个线程同时开启多个请求,一个请求的异常不会影响其他

实现IO操作有3种方式:

同步  【串行操作】
多进程【更消耗资源,有操作系统调用】 --> 更适合计算密集型操作因为需要并发操作,消耗CPU
       线程是计算机工作的最小单元
多线程【有CPU进行调用,节省资源】    --> 更适合多IO操作,因为发送请求后不消耗CPU资源
       进程中至少有一个线程,默认都有一个主线程且共享进程的内部资源
多协程 --> 一个进程内一个线程完成多个任务【可以同时接收多个请求,然后在一个一个的处理请求】
       如果遇到阻塞则执行下一个请求,如果阻塞的请求收到回复后执行刚才阻塞的那个请求【回调实现】,效率比多线程还高.

注:线程里面有GIL【global Interpreter lock】,Python里面有个GIL锁[该锁保障同时间1个进程内只允许1个线程操作],不允许CPU操作多个线程,不允许CPU调用资源[也就是限制了CPU,即限制了多线程]。但是线程可以进行IO操作,多个线程可以同时进行多个IO操作[URL 请求等,因为CPU的只需要发送一下即可,发送后不消耗cpu资源],

利用多线程实现IO的异步操作:

import requests
from concurrent.futures.thread import ThreadPoolExecutor
pool = ThreadPoolExecutor(5) # 创建线程池,也可以理解为多线程了这里
url_list = [
'https://www.baidu.com/',
'https://www.taobao.com/',
'https://www.google.com/search',
'https://hao.360.cn/',
]
def async_url(url):
try:
response = requests.get(url)
print('正常请求:', '【', url, '】', response.content)
except Exception as e:
print('异常请求:', e)
for url in url_list:
print('请求开始:', url)
pool.submit(async_url, url)
pool.shutdown() # 关闭线程

后台显示结果:

利用多进程实现IO的异步操作:

[其他同上]
from concurrent.futures.process import ProcessPoolExecutor
import requests
pool = ProcessPoolExecutor(5) # 创建进程池,也可以理解为多线程了这里
pool.submit(async_url, url) # async_url是个方法,url是传递过去参数
pool.shutdown() # 关闭进程

异步IO_1---asyncio模块(no-http)

Python学习---IO的异步[asyncio模块(no-http)]

异步IO_2---gevent+Grequests

Python学习---IO的异步[gevent+Grequests模块]

异步IO_3---twisted模块

Python学习---IO的异步[twisted模块]

异步IO_4---tornado模块

Python学习---IO的异步[tornado模块]

自定义异步IO

Python学习---Python的异步IO[all]的更多相关文章

  1. Python学习——多线程,异步IO,生成器,协程

    Python的语法是简洁的,也是难理解的. 比如yield关键字: def fun(): for i in range(5): print('test') x = yield i print('goo ...

  2. Python之路,Day10 - 异步IO\数据库\队列\缓存

    Python之路,Day9 - 异步IO\数据库\队列\缓存   本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...

  3. Day10 - Python协程、异步IO、redis缓存、rabbitMQ队列

    Python之路,Day9 - 异步IO\数据库\队列\缓存   本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...

  4. 1 python学习——python环境配置

    1 python学习--python环境配置 要学习python语言,光看书看教程还是不好,得动手去写.当然,不管学习什么编程语言,最佳的方式还在于实践. 要实践,先得有一个Python解释器来解释执 ...

  5. Python学习---Python安装与基础1205

    1.0. 安装 1.1.1. 下载 官网下载地址:https://www.python.org/downloads/release/python-352/ 1.1.2. 配置环境变量 因为在安装的时候 ...

  6. Python学习---Python下[元组]的学习

    元组是不可变的, 用小括号()定义,而且一旦定义 ,不可变[类型是tuple] [元组看做一个整体,不可拆分,不可赋值,但可以全部重新赋值] 通过圆括号,用逗号分隔,常用在使语句或用户定义的函数能够安 ...

  7. Python高级编程和异步IO并发编程

    第1章 课程简介介绍如何配置系统的开发环境以及如何加入github私人仓库获取最新源码. 1-1 导学 试看 1-2 开发环境配置 1-3 资源获取方式第2章 python中一切皆对象本章节首先对比静 ...

  8. python 多协程异步IO爬取网页加速3倍。

    from urllib import request import gevent,time from gevent import monkey#该模块让当前程序所有io操作单独标记,进行异步操作. m ...

  9. Python协程、异步IO

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...

随机推荐

  1. 在Linux系统安装Nodejs最简单步骤

    一.去官网下载和自己系统匹配的文件 英文网址:https://nodejs.org/en/download/ 中文网址:http://nodejs.cn/download/ 通过  uname -a ...

  2. Nodejs学习笔记(八)—Node.js + Express 实现上传文件功能(felixge/node-formidable)

    前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能----文件上传,示例以一个上传图片的功能为例子 上传功能命名用formidable实现,示例很简单! PS:最近比较忙,距上一次 ...

  3. JavaScript函数——预编译

    四部曲 创建AO对象 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined. 将实参值和形参值统一 在函数体内找函数声明,值赋予函数体. 权重按顺序依次增加.以下例子即可体现上述规则 ...

  4. Ionic项目中如何使用Native Camera

    本文介绍如何在ionic项目中使用设备的camera. Ionic版本:v3.2.0 / 2017-05-10 / MIT Licensed / Release Notes ============= ...

  5. 监测代码执行时间之Stopwatch

    var sw = new System.Diagnostics.Stopwatch(); sw.Start(); 中间为要执行的代码 sw.Stop(); var msg = "上面操作耗时 ...

  6. unity 中的协程

    //The coroutine will continue after all Update functionshave been calledon the next frame. ; //Conti ...

  7. 使用Repeater控件实现三层嵌套以及分页效果

    PS: 第一次用Repeater控件 记录一下 请忽略我的命名不规范  请忽略我的最终效果图(太丑了) 需要用到的朋友可以自行调整的漂亮点 ====================最终效果图===== ...

  8. .net面试题[转载]

    1.简述private.protected.public.internal修饰符的访问权限. private:私有成员,在类的内部才可以访问. protected:保护成员,该类内部和继承类中可以访问 ...

  9. JSP学习笔记(3)-JSP内置对象

    有些对象不用声明就可以在JSP页面的Java程序片和表达式部分使用,这些对象就是JSP的内置对象.  JSP常用的内置对象有request,response,session,application,o ...

  10. vs2017调试源代码

    最近刚入职 ,带我得导师发给我一堆项目,什么云端和医院端,各种wcf服务.window服务和一些公共类库来回调用.搞得是迷迷糊糊,晕头转向.反正是一脸大萌比... 不过经过几个日日夜夜得不停奋战,大致 ...