当前位置: 首页 > news >正文

python3 使用 asyncio 代替线程

python3提供了协程专用的关键字 async await, 还提供了 asyncio库, 来进行异步非阻塞的io操作

异步非阻塞的io操作?

没有老师检查我也不知道自己算不算完全懂了, 就不做无用功尝试说得通俗易懂了.
想要从原理开始理解的话, 推荐tornado的文档

我为何使用asyncio来代替传统线程进行io操作?

  • 由于时间主要耗费在io操作上, 其他操作并发需求不大.
  • 不用规定并行多少, 比较方便稳定.
  • 熟悉tornado工作原理

举例

并行访问某网页十次

import asyncio
import requests
loop = asyncio.get_event_loop()
async def t():                                                    
    get = lambda:requests.get('http://baidu.com')
    temp = await loop.run_in_executor(None, get)
    print(temp)   
loop.run_until_complete(asyncio.gather(*[t() for i in range(10)]))

上面这几行代码就可以完成这些操作了.

loop = asyncio.get_event_loop() 协程本身并不具备并行能力, 但是有了这个事件loop就可以进行并行io请求

get = lambda:requests.get('http://baidu.com')
temp = await loop.run_in_executor(None, get)

一般函数是无法被await修饰的, 必须用api封装一下(感觉很像threading), 我之所以再封装一次get, 是因为run_in_executor传参数比较坑, 不支持**kwargs

loop.run_until_complete(asyncio.gather(*[t() for i in range(10)]))

run_until_complete这个api是指运行内容物直到结束(api如其名), gather是把任务组合到一起, 如果*的部分有迷惑的话, 你写asycio.gather(t(),t(), t()...)也是可以的.

おわり.

相关文章:

  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • kubernetes集群配置dns服务
  • VC窗口类的销毁-是否需要delete
  • 浅谈node中的流stream(一)
  • 源码解读之ArrayList
  • FIR基本型仿真_03
  • springboot(十九):使用Spring Boot Actuator监控应用
  • Spring源码系列:依赖注入(四)-总结
  • react native android 真机调试
  • WeexConf 2018干货系列|Weex + Ui
  • CSS最常用的三种选择器
  • GridView中使用CheckBox
  • 使用Python读写csv文件的三种方法
  • jdk动态代理使用及原理
  • mariadb/mysql使用Navicat连接报错
  • Docker容器管理
  • E-HPC支持多队列管理和自动伸缩
  • Mysql优化
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Solarized Scheme
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Tornado学习笔记(1)
  • ubuntu 下nginx安装 并支持https协议
  • ucore操作系统实验笔记 - 重新理解中断
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • windows下如何用phpstorm同步测试服务器
  • 多线程 start 和 run 方法到底有什么区别?
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 嵌入式文件系统
  • 为视图添加丝滑的水波纹
  • 消息队列系列二(IOT中消息队列的应用)
  • hi-nginx-1.3.4编译安装
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #pragma once与条件编译
  • $forceUpdate()函数
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (13):Silverlight 2 数据与通信之WebRequest
  • (附源码)计算机毕业设计高校学生选课系统
  • (简单) HDU 2612 Find a way,BFS。
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (原創) 物件導向與老子思想 (OO)
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • **python多态
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net中生成excel后调整宽度
  • .NET中使用Protobuffer 实现序列化和反序列化
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [Android]使用Android打包Unity工程
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [BZOJ] 2427: [HAOI2010]软件安装