Python学习---Python的异步IO[all]

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模块
异步IO_4---tornado模块
自定义异步IO
Python学习---Python的异步IO[all]的更多相关文章
- Python学习——多线程,异步IO,生成器,协程
Python的语法是简洁的,也是难理解的. 比如yield关键字: def fun(): for i in range(5): print('test') x = yield i print('goo ...
- Python之路,Day10 - 异步IO\数据库\队列\缓存
Python之路,Day9 - 异步IO\数据库\队列\缓存 本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...
- Day10 - Python协程、异步IO、redis缓存、rabbitMQ队列
Python之路,Day9 - 异步IO\数据库\队列\缓存 本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...
- 1 python学习——python环境配置
1 python学习--python环境配置 要学习python语言,光看书看教程还是不好,得动手去写.当然,不管学习什么编程语言,最佳的方式还在于实践. 要实践,先得有一个Python解释器来解释执 ...
- Python学习---Python安装与基础1205
1.0. 安装 1.1.1. 下载 官网下载地址:https://www.python.org/downloads/release/python-352/ 1.1.2. 配置环境变量 因为在安装的时候 ...
- Python学习---Python下[元组]的学习
元组是不可变的, 用小括号()定义,而且一旦定义 ,不可变[类型是tuple] [元组看做一个整体,不可拆分,不可赋值,但可以全部重新赋值] 通过圆括号,用逗号分隔,常用在使语句或用户定义的函数能够安 ...
- Python高级编程和异步IO并发编程
第1章 课程简介介绍如何配置系统的开发环境以及如何加入github私人仓库获取最新源码. 1-1 导学 试看 1-2 开发环境配置 1-3 资源获取方式第2章 python中一切皆对象本章节首先对比静 ...
- python 多协程异步IO爬取网页加速3倍。
from urllib import request import gevent,time from gevent import monkey#该模块让当前程序所有io操作单独标记,进行异步操作. m ...
- Python协程、异步IO
本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...
随机推荐
- 在 mac 上利用 homebrew 安装软件
在mac经常需要安装一些软件,你可以通过app store下载,或者可以通过浏览袭搜索下载.这里介绍通过homebrew安装一些软件,它会自动为你下载一些软件的相关依赖,免去安装的烦恼. 首先我们需要 ...
- redis实战笔记(7)-第7章 基于搜索的应用程序
本章主要内容 使用Redis进行搜索 对搜索结果进行排序 实现广告定向 实现职位搜索
- 纯Java JDBC连接数据库,且用JDBC实现增删改查的功能
Java JDBC连接数据库 package cn.cqvie.yjq; import java.sql.*; /** * 注册数据库的驱动程序,并得到数据库的连接对象 * @author yu * ...
- oracle存储过程删除树状结构的表数据
今天在删除一个车辆品牌表的时候,遇到了一个问题,是在java的代码中做逻辑删除还是直接在Oracle中一次删除完成呢 思来想去觉得还是在sql里直接删除比较合适, 为什么呢? 第一,涉及数据库的读写操 ...
- [转]使用EntityFramework6.1的DbCommandInterceptor拦截生成的SQL语句
本文转自:http://www.cnblogs.com/Ax0ne/p/3620958.html 开始 EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.En ...
- Ionic3 UI组件之 ImageLoader
ImageLoader:通过后台线程加载图片(异步)并缓存.类似于Glide或者Picasso. 组件特性: 后台线程下载图片,下载速度更快,不使用webview的资源: 缓存图像.图像将在您下次显示 ...
- 利用扩展方法重写JSON序列化和反序列化
利用.NET 3.5以后的扩展方法重写JSON序列化和反序列化,在代码可读性和可维护性上更加加强了. 首先是不使用扩展方法的写法 定义部分: /// <summary> /// JSON ...
- IDEA 2019注册码
N757JE0KCT-eyJsaWNlbnNlSWQiOiJONzU3SkUwS0NUIiwibGljZW5zZWVOYW1lIjoid3UgYW5qdW4iLCJhc3NpZ25lZU5hbWUiO ...
- python学习之老男孩python全栈第九期_day015知识点总结
# 作用域相关(2)locals() # 返回本地作用域中的所有名字 globals() # 返回全局作用域中的所有名字 # 迭代器/生成器相关(3)range()print('__next__' i ...
- html.div
使用div构造简单的信息图片 html: <!DOCTYPE html><html><head><meta charset="utf-8" ...