理解 python 的 async:
1. 协程后面的技术也是 IO 多路复用, Nginx 和 nodejs 都充分利用了这种机制.
2. Flask 线程中为什么不能直接使用标准库 asyncio 来支持异步?
    asyncio 一定要有应该eventloop, 而这个 eventloop 必须运行在主线程, 不能运行在子线程中, 所以在Flask 线程中不能直接使用标准库 asyncio.
3. 如果在单并发的情况下, web响应很慢. 改成 async模式, 并不会改善"单次"请求响应速度.  当然改成 async 通常来讲还是有意义的, 因为小并发时候响应很差, 当并发量稍微增加时, 在同步模式下, 响应就会急剧变差, 甚至无法响应.  async 模式下, 从小并发到大并发, 响应速度下降非常缓慢.

如何将Python的同步方法改写异步? Python的异步方法大概可分三类:

1. 专门的基于 asyncio 优化的单线程异步方法
    优点: 这类方法使用简单, 就像同步方法调用一样, 并发性能很高, 即使是在大并发下, latency也不会变差.
    缺点: 基于 asyncio 的类库比较少, 最有名的是 aiohttp 库, https://github.com/aio-libs 还有一些.
    实现一个这样的方法, 有些难度, 可以参考 aio-libs 下的一些类库.
2. 基于多线程(多进程)的 awaitable 方法
   优点: 这类方法使用简单, 就像同步方法调用一样. 另外, 编写这类方法也非常简单, 先先一个同步方法, 然后利用一个 wrapper 就能转成异步方法.
   缺点: 性能较差, 主要是因为没有做过细节优化, 只有方法整体运行完毕后, 才会将控制权交出, 管控粒度太粗, 通过多线程来支持并发.
3. 传统的多线程(多进程)的后台任务
   优点: 如果不需要加上回调功能, 使用这种方法非常简单, 代码也容易维护, 并发性能也很好.
   缺点: 要及时获取这种后台任务的结果, 只能使用回调函数, 代码就变得难以维护.

说明:多线程(多进程)推荐使用 cocurrent.futures.ThreadPoolExecutor 和 cocurrent.futures.ProcessPoolExecutor 两个池.

理解Python Async
https://www.aeracode.org/2018/02/19/python-async-simplified/
https://stackabuse.com/overview-of-async-io-in-python-3-7/

https://pymotw.com/3/asyncio/index.html

https://www.blog.pythonlibrary.org/2016/07/26/python-3-an-intro-to-asyncio/

https://tryexceptpass.org/article/asyncio-in-37/

https://tryexceptpass.org/article/controlling-python-async-creep/

https://tryexceptpass.org/article/threaded-asynchronous-magic-and-how-to-wield-it/

基于 asyncio 的 Aiohttp web 框架, 比如适合作 restful api 服务

Aiohttp 和 Flask 的对比
https://stackabuse.com/asynchronous-python-for-web-development/
https://stackabuse.com/asynchronous-vs-synchronous-python-performance-analysis/

python中重要的模块--asyncio
https://www.cnblogs.com/zhaof/p/8490045.html
https://www.syncd.cn/article/asyncio_article_01
https://www.syncd.cn/article/asyncio_article_02
https://www.syncd.cn/article/asyncio_article_03

可以为 awaitable 的 Task 增加回调:

task.add_done_callback(got_result)         # task完成的时候通知我们

Django 社区推动的 ASGI 规范和实现
ASGI 服务器和框架
https://asgi.readthedocs.io/en/latest/implementations.html

Sanic  -类 flask 的异步web framework

Python黑魔法 --- 异步IO( asyncio) 协程
https://www.jianshu.com/p/b5e347b3a17c

asyncio 中的 future 其实和 cocurrent.futures 中的future 不是一回事,

https://stackoverflow.com/questions/49350346/how-to-wrap-custom-future-to-use-with-asyncio-in-python

python async的更多相关文章

  1. 并发 并行 进程 线程 协程 异步I/O python async

    一些草率不精确的观点: 并发: 一起发生,occurence: sth that happens. 并行: 同时处理. parallel lines: 平行线.thread.join()之前是啥?落霞 ...

  2. Python Async/Await入门指南

    转自:https://zhuanlan.zhihu.com/p/27258289 本文将会讲述Python 3.5之后出现的async/await的使用方法,以及它们的一些使用目的,如果错误,欢迎指正 ...

  3. Python资源大全

    The Python Tutorial (Python 2.7.11) 的中文翻译版本.Python Tutorial 为初学 Python 必备官方教程,本教程适用于 Python 2.7.X 系列 ...

  4. python coroutine

    1. Python Async/Await入门指南 2. 用 Python 3 的 async / await 做异步编程 3.

  5. Python 异步编程笔记:asyncio

    个人笔记,不保证正确. 虽然说看到很多人不看好 asyncio,但是这个东西还是必须学的.. 基于协程的异步,在很多语言中都有,学会了 Python 的,就一通百通. 一.生成器 generator ...

  6. Github上的python开源项目

    Python开源项目,期待大家和我们一起共同维护 github排名榜单 https://github.com/trending github搜索榜单:https://github.com/search ...

  7. python异步编程 (转载)

    Python Async/Await入门指南   转自:https://zhuanlan.zhihu.com/p/27258289 本文将会讲述Python 3.5之后出现的async/await的使 ...

  8. python爬虫如何提高效率

    开启线程池: 线程池 asyncio 特殊的函数 协程 任务对象 任务对象绑定 事件循环 from multiprocessing.dummy import Pool map(func,alist): ...

  9. Python3 ORM hacking

    #!/usr/bin/env python3 # -*- coding: utf- -*- # # Python3 ORM hacking # 说明: # 之前分析了一个Python2 ORM的源代码 ...

随机推荐

  1. hive查询语句入门(hive DDL)

    hive DDL 启动hadoop /apps/hadoop/sbin/start-all.sh 开启MySQL库,用于存放hive的元数据 sudo service mysql start 启动hi ...

  2. 微信两种签名算法MD5和HMAC-SHA256

    在做微信接口开发的过程中, 有时候发现会提示签名校验失败, 一模一样的签名逻辑就是有些接口跑步通, 找了一圈发现挺坑的; 原来是有些接口的signType签名类型有区别, 有些接口signType要求 ...

  3. 小程序Canvas性能优化实战

    以下内容转载自totoro的文章<小程序Canvas性能优化实战!> 作者:totoro 链接:https://blog.totoroxiao.com/canvas-perf-mini/ ...

  4. jmeter控制器(三)

    While Controllert当控制器: 当满足条件的情况下,就会执行控制器里面的脚本,首先我们设置线程组循环次数为10,如下图: 其次在配置元件中添加一个计数器,并设置从0到最大的10,每次递增 ...

  5. 微信小程序的bindtap事件

    在微信小程序中,要想获取元素的属性值,需要用到 bindtap事件,如果想要正确获取到属性值,对属性的命名还有一定要求 如下是正确的方式data-money-Num="9.93": ...

  6. zhy2_rehat6_mysql01 - 二进制5.7.txt

    mysql 5.7版本的二进制安装方法 export LANG=en_US Centos7 X64 注意:安装完centos7 后,linux需要指定新建一个用户,要求密码强度很高,才能通过,安装系统 ...

  7. 以太网驱动的流程浅析(二)-Ifconfig的详细代码流程【原创】

    以太网驱动流程浅析(二)-ifconfig的详细代码流程 Author:张昺华 Email:920052390@qq.com Time:2019年3月23日星期六 此文也在我的个人公众号以及<L ...

  8. xshell连接console口

  9. eNSP仿真软件之利用三层交换机实现VLAN间路由

    1.实验原理: VLAN将一个物理的LAN在逻辑上划分成多个广播域.VLAN内的主机间可以直接通信,而VLAN间不能直接互通. 在现实网络中,经常会遇到需要跨VLAN相互访问的情况,工程师通常会选择一 ...

  10. Jenkins实现单一安卓项目打包多个module填坑实录

    今天接手一个任务,已有项目结构上新添加了一个module,这个module打包工作需要在Jenkins上添加一个方便测试点击的打包工程 因为之前已有现成的打包工程,我直接新建了一个工程并且复制原有工程 ...