python asyncio_Python 中的异步编程:Asyncio
异步和同步的代码对比
现在我们实际验证异步模式的切实有效,我会比较两段 python 脚本,这两个脚本除了sleep方法外,其余部分完全相同。在第一个脚本里,我会用标准的 time.sleep 方法,在第二个脚本里使用 asyncio.sleep 的异步方法。
这里使用 Sleep 是因为它是一个用来展示异步方法如何操作 I/O 的最简单办法。
使用同步 sleep 方法的代码:import asyncio
import time
from datetime import datetime
async def custom_sleep():
print('SLEEP', datetime.now())
time.sleep(1)
async def factorial(name, number):
f = 1
for i in range(2, number+1):
print('Task {}: Compute factorial({})'.format(name, i))
await custom_sleep()
f *= i
print('Task {}: factorial({}) is {}\n'.format(name, number, f))
start = time.time()
loop = asyncio.get_event_loop()
tasks = [
asyncio.ensure_future(factorial("A", 3)),
asyncio.ensure_future(factorial("B", 4)),
]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
end = time.time()
print("Total time: {}".format(end - start))
脚本输出:Task A: Compute factorial(2)
SLEEP 2017-04-06 13:39:56.207479
Task A: Compute factorial(3)
SLEEP 2017-04-06 13:39:57.210128
Task A: factorial(3) is 6
Task B: Compute factorial(2)
SLEEP 2017-04-06 13:39:58.210778
Task B: Compute factorial(3)
SLEEP 2017-04-06 13:39:59.212510
Task B: Compute factorial(4)
SLEEP 2017-04-06 13:40:00.217308
Task B: factorial(4) is 24
Total time: 5.016386032104492
使用异步 Sleep 的代码:import asyncio
import time
from datetime import datetime
async def custom_sleep():
print('SLEEP {}\n'.format(datetime.now()))
await asyncio.sleep(1)
async def factorial(name, number):
f = 1
for i in range(2, number+1):
print('Task {}: Compute factorial({})'.format(name, i))
await custom_sleep()
f *= i
print('Task {}: factorial({}) is {}\n'.format(name, number, f))
start = time.time()
loop = asyncio.get_event_loop()
tasks = [
asyncio.ensure_future(factorial("A", 3)),
asyncio.ensure_future(factorial("B", 4)),
]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
end = time.time()
print("Total time: {}".format(end - start))
脚本输出:Task A: Compute factorial(2)
SLEEP 2017-04-06 13:44:40.648665
Task B: Compute factorial(2)
SLEEP 2017-04-06 13:44:40.648859
Task A: Compute factorial(3)
SLEEP 2017-04-06 13:44:41.649564
Task B: Compute factorial(3)
SLEEP 2017-04-06 13:44:41.649943
Task A: factorial(3) is 6
Task B: Compute factorial(4)
SLEEP 2017-04-06 13:44:42.651755
Task B: factorial(4) is 24
Total time: 3.008226156234741
从输出可以看到,异步模式的代码执行速度快了大概两秒。当使用异步模式的时候(每次调用 await asyncio.sleep(1) ),进程控制权会返回到主程序的消息循环里,并开始运行队列的其他任务(任务A或者任务B)。
当使用标准的 sleep方法时,当前线程会挂起等待。什么也不会做。实际上,标准的 sleep 过程中,当前线程也会返回一个 python 的解释器,可以操作现有的其他线程,但这是另一个话题了。
python asyncio_Python 中的异步编程:Asyncio相关推荐
- python 异步编程——asyncio
python 异步编程--asyncio 摘要 1. 协程 1.1 基本概念 1.2 实现方法 1.2.1 greenlet 1.2.2 yield 1.2.3 asyncio模块 1.2.4 asy ...
- python协程和异步编程
文章目录 协程 & 异步编程(asyncio) 1. 协程的实现 1.1 greenlet 1.2 yield 1.3 asyncio 1.4 async & awit 1.5 小结 ...
- 一文说通C#中的异步编程补遗
前文写了关于C#中的异步编程.后台有无数人在讨论,很多人把异步和多线程混了. 文章在这儿:一文说通C#中的异步编程 所以,本文从体系的角度,再写一下这个异步编程. 一.C#中的异步编程演变 1. ...
- 一文说通C#中的异步编程
天天写,不一定就明白. 又及,前两天看了一个关于同步方法中调用异步方法的文章,里面有些概念不太正确,所以整理了这个文章. 一.同步和异步. 先说同步. 同步概念大家都很熟悉.在异步概念出来之前,我 ...
- 【转】.Net中的异步编程总结
一直以来很想梳理下我在开发过程中使用异步编程的心得和体会,但是由于我是APM异步编程模式的死忠,当TAP模式和TPL模式出现的时候我并未真正的去接纳这两种模式,所以导致我一直没有花太多心思去整理这两部 ...
- 了解和使用DotNetCore和Blazor中的异步编程
目录 介绍 您对异步编程了解什么? 那么,什么是异步编程? 我们什么时候应该使用它? 任务.线程.计划.上下文 到底是怎么回事? Asnyc编码模式 命名约定 异步任务模式 任务模式 事件模式 阻塞与 ...
- .NET中的异步编程——常见的错误和最佳实践
目录 背景 async void 没有线程 Foreach和属性 始终异步 在这篇文章中,我们将通过使用异步编程的一些最常见的错误来给你们一些参考. 背景 在之前的文章中,我们开始分析.NET世界中的 ...
- C#中的异步编程(Async)
文章目录 C#中的异步编程(Async) 前言 示例代码 C#中的异步编程(Async) 前言 所谓的异步,就是指代码在运行的过程中,不会发生阻塞,例如我们玩游戏的时候,游戏在下载资源或者在加载本地资 ...
- python异步_Python中的异步编程
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. Quora的使命就是分享和增加全世界的知识,并且为了达到这个使命,我们不断地推出改进来让Quora对于我们 ...
最新文章
- django drf Filter
- 45.JVM调优策略、常见问题:内存泄漏(年老代堆空间被占满、持久代被占满、堆栈溢出、线程堆栈满、系统内存被占满)优化方法:优化目标、优化GC步骤、优化总结;案例分析(公司系统参数、网上给的配置参数)
- 最常用的6种原型文件格式对比
- 1、MapReduce理论简介
- Photon Release 4.8.0汉化(附图教程)
- SpringBoot 2.0.0 注入SpingCloud 有bug(目前只有SpringBoot 1.5+ 版本的支持)
- html页面插歌,怎样在HTML播放器里插入歌曲
- 实对称矩阵的特征值求法_MIT—微分方程与线性代数笔记6.5 对称矩阵,实特征值,正交特征向量...
- CAD插件学习系列教程(四) 一款轻量级的CAD里程标注插件
- 游戏Gala—基于星际文件系统的非中心化游戏
- PSPNet | 语义分割及场景分析
- java 获取拼音_Java获取汉字对应的拼音(全拼或首字母)
- Prioritizing Web Usability
- linux死机日志文件,linux系统死机分析及解决方法
- win7计算机无法识别分辨率,window7分辨率显示不正常
- 《般若波罗蜜多心经》全文及解释
- 【数据库设计】学籍管理的数据库系统
- 苹果12轻点背面不灵敏如何解决
- 永恒之塔linux服务端,【永恒之塔单机5.8-6.5服务端】2020.06首发一键安装PC大型端游单机游戏客户端支持局域网联机玩[附视频搭建教程]...
- VIPL Lab 9篇ACM MM 2019和IEEE TIP 论文精解
热门文章
- 雨滴桌面时间插件_只需要五步,让你的桌面变得干净漂亮
- python中encode与decode编码转换
- Flink SQL 1.11 新功能与最佳实践
- 几种字符串到byte[] 数组转化为String 的方法
- 漫步最优化二十三——一维优化
- python 获取键盘输入、同时有超时的功能_python 获取键盘输入,同时有超时的功能示例...
- 变分法理解2——基本方法
- Linux学习笔记12——配置ftp、squid、Tomcat、Samba、MySQL主从
- Linux学习笔记10
- 【实践驱动开发3-003】TI WL1835MODCOM8 在android的移植 - 软件获取2