当前位置: 首页 > 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连接报错
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • [译]CSS 居中(Center)方法大合集
  • 【EOS】Cleos基础
  • const let
  • CSS实用技巧
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Linux各目录及每个目录的详细介绍
  • mysql 5.6 原生Online DDL解析
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • PV统计优化设计
  • Python利用正则抓取网页内容保存到本地
  • webgl (原生)基础入门指南【一】
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 微服务框架lagom
  • 为视图添加丝滑的水波纹
  • 自制字幕遮挡器
  • ​2020 年大前端技术趋势解读
  • #100天计划# 2013年9月29日
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (办公)springboot配置aop处理请求.
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET Core 通过 Ef Core 操作 Mysql
  • .Net MVC + EF搭建学生管理系统
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .net和jar包windows服务部署
  • ::
  • ;号自动换行
  • @vue/cli 3.x+引入jQuery
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [20170728]oracle保留字.txt
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [Android]常见的数据传递方式
  • [BT]BUUCTF刷题第8天(3.26)
  • [CSS]盒子模型