python异步初步窥探
1.异步之难:因为其执行吮吸不可预料,当下正要发生什么事件不可预料。
程序下一步行为往往依赖上一步值执行结果,如何知晓上次异步调用已完成并获取结果,
回调成了必然选择,那又需要面临“回调地狱”的折磨
2.事例:例如我前不久主导重写的项目,使用Python异步编程,改版后由原来的7台服务器削减至3台,成本骤降57%。
3.名言:除了瓶颈之外,任何改进都是幻觉
4.I/O是计算机运行速度提升的最大瓶颈。最大地球上最发达、规模最大的计算机程序,莫过于因特网,网络I/O是最大的瓶颈。所以,诸多异步框架都针对的是网络I/O。
5.爬虫:自动从万维网上获取信息的脚本。例如,搜索引擎从万维网上获取网页。
6.分进程的时间主要耗在:进程切换开销。当进程数量大于CPU核心数量时,进程切换时必然需要的。
多进程另一个缺点:状态共享。(Process)
7.继续改进,多线程:一个python进程中,只允许有一个线程处于运行状态。线程调度是抢占式的,所以也存在竞态条件的可能,如何保证执行过的线程不会重复执行。
8.GIL:为了解决多线程问题,即线程间数据一致性和状态同步。而解决最简单方法就是加锁,于是有了GIL这把大锁(Global Interpreter Lock)。
9.非阻塞方式:可能在等待一个结果时候,cpu会存在空闲下来的时候。如何有效利用这段COU空闲时间成了下一步主要解决的问题。
10.非阻塞方式改进:OS将I/O状态的变化都封装成了事件。并且提供了专门的系统模块(演变:select-->poll-->kqueue(BSD内核),epoll(Linux内核))让应用程序可以接收事件通知。当接收到要等到的通知之后,通过事件回调继续执行。
11.总结:从同步阻塞到异步非阻塞,异步编程大多数应用 事件循环+回调,当然大多数时间都花在设计回调函数上。
12.事件循环+回调-->asynclo原生协程模式
13.事件循环+回调这种方式存在问题:回调层次过多时代码可读性差;破坏代码结构,共享状态管理困难,错误处理困难。
Python 生态也以终为始,秉承着“程序猿不必难程序猿”的原则,让语言和框架开发者苦逼一点,也要让应用开发者舒坦。
在事件循环+回调的基础上衍生出了基于协程的解决方案,代表作有:Tornado、Twisted、asyncio 等。
14.异步编程最大的困难:异步任务何时执行完毕?接下来要对异步调用的返回结果做什么操作?
上述问题已经通过事件循环和回调解决了。程序知道当前所处的状态,而且要将在不同的回调之间延续下去。
为了规避事件循环和回调的问题,采用协作式多任务。任务之间得相互通知,每个任务有自己的状态。
15.协程:协作式的例程。它是非抢占式的多任务子例程的概括,可以允许有多个入口点在例程中确定的位置来控制程序的暂停与恢复执行。
例程:编程语言定义的可被调用的代码段,一般用成为函数或方法的代码结构体来体现。
16.早期发现生成器的特点和协程很像。每一次迭代之间,会暂停执行,继续下一次迭代的时候还不会丢失先前的状态。
17.基于生成器的协程来实现:
18.未来对象:怎么知道异步调用的结果?先设计一个对象,异步调用执行完的时候,就把结果放在它里面。这种对象称之为未来对象。
19.用 yield from 改进生成器协程。
20.Python 3.6中asyncio库成为标准库的正式一员。
python异步初步窥探的更多相关文章
- 深入理解 Python 异步编程(上)
http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知 ...
- Python异步IO --- 轻松管理10k+并发连接
前言 异步操作在计算机软硬件体系中是一个普遍概念,根源在于参与协作的各实体处理速度上有明显差异.软件开发中遇到的多数情况是CPU与IO的速度不匹配,所以异步IO存在于各种编程框架中,客户端比如浏览 ...
- python异步加协程获取比特币市场信息
目标 选取几个比特币交易量大的几个交易平台,查看对应的API,获取该市场下货币对的ticker和depth信息.我们从网站上选取4个交易平台:bitfinex.okex.binance.gdax.对应 ...
- 深入理解Python异步编程(上)
本文代码整理自:深入理解Python异步编程(上) 参考:A Web Crawler With asyncio Coroutines 一.同步阻塞方式 import socket def blocki ...
- 这篇文章讲得精彩-深入理解 Python 异步编程(上)!
可惜,二和三现在还没有出来~ ~~~~~~~~~~~~~~~~~~~~~~~~~ http://python.jobbole.com/88291/ ~~~~~~~~~~~~~~~~~~~~~~~~~~ ...
- [django]python异步神器-celery
python异步神器celery https://segmentfault.com/a/1190000007780963
- 转-python异步IO-asyncio
原文连接 http://blog.chinaunix.net/uid-190176-id-4223282.html 前言 异步操作在计算机软硬件体系中是一个普遍概念,根源在于参与协作的各实体处理速度上 ...
- uvloop —— 超级快的 Python 异步网络框架
简短介绍 asyncio是遵循Python标准库的一个异步 I/O框架.在这篇文章里,我将介绍 uvloop: 可以完整替代asyncio事件循环.uvloop是用Cython写的,基于 libuv. ...
- python 异步编程
Python 3.5 协程究竟是个啥 Yushneng · Mar 10th, 2016 原文链接 : How the heck does async/await work in Python 3.5 ...
随机推荐
- linux操作之软件安装(一)
rpm 包安装 RedHat Package Manager的缩写 , linux 的软件包可能存在依赖关系,比如某某依赖某某才能使用. 挂载一个光盘 mount -t auto /dev/cdrom ...
- QWebView 与Js 交互
我本愚钝,在网上搜了一下没找到可以运行的栗子,遂在这记录一下吧. 环境:win10 64位系统 qt 4.8.7 (mingw32) qtcreator(4.5.0) 1. 建立一个 Widgets ...
- Django学习之mysql增删改查
上节介绍了如何使用命令行操作mysql增删改查,现在介绍如何使用python管理mysql 使用pip 下载完mysql后,mysql会以pymysql模块的形式存储在pycharm的包文件里.我们通 ...
- 用elk+filebeat监控容器日志
elk 为 elasticsearch(查询搜索引擎),logstash(对日志进行分析和过滤,然后转发给elasticsearch),kibana(一个web图形界面用于可视化elasticsea ...
- PAT (Basic Level) Practice 1007 素数对猜想
个人练习 让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数.显然有d1=1,且对于n>1有dn是偶数.“素数对猜想”认为“存在无穷多对相邻且 ...
- spark2.2 从入门到精通 视频教程 百度云网盘下载地址
spark2.2 从入门到精通 视频教程 百度云网盘下载地址 链接:https://pan.baidu.com/s/1sm2Jdmt 密码:rdea
- C# 终本案件、综合执行人、裁判文书爬虫
终本案件:http://zxgk.court.gov.cn/zhongben/new_index.html 综合执行人:http://zxgk.court.gov.cn/zhixing/new_ind ...
- 模拟实现MyBatis中通过SQL反射实体类对象功能
话不多说,直接上干货! package cn.test; import java.lang.reflect.Method; import java.sql.Connection; import jav ...
- 「日常训练」Uncle Tom's Inherited Land*(HDU-1507)
题意与分析 题意是这样的:给你一个\(N\times M\)的图,其中有一些点不能放置\(1\times 2\)大小的矩形,矩形可以横着放可以竖着放,问剩下的格子中,最多能够放多少个矩形. 注意到是\ ...
- unittest,selenium——批量,多线程执行多文档用例
之前做过批量执行多.py文件,为了省时也做过单py文件多线程,现在做多py文件用例多线程 # coding:utf-8import unittestimport osimport timeimport ...