异步和同步的代码对比

现在我们实际验证异步模式的切实有效,我会比较两段 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相关推荐

  1. 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 ...

  2. python协程和异步编程

    文章目录 协程 & 异步编程(asyncio) 1. 协程的实现 1.1 greenlet 1.2 yield 1.3 asyncio 1.4 async & awit 1.5 小结 ...

  3. 一文说通C#中的异步编程补遗

    前文写了关于C#中的异步编程.后台有无数人在讨论,很多人把异步和多线程混了. 文章在这儿:一文说通C#中的异步编程 所以,本文从体系的角度,再写一下这个异步编程.   一.C#中的异步编程演变 1. ...

  4. 一文说通C#中的异步编程

    天天写,不一定就明白. 又及,前两天看了一个关于同步方法中调用异步方法的文章,里面有些概念不太正确,所以整理了这个文章.   一.同步和异步. 先说同步. 同步概念大家都很熟悉.在异步概念出来之前,我 ...

  5. 【转】.Net中的异步编程总结

    一直以来很想梳理下我在开发过程中使用异步编程的心得和体会,但是由于我是APM异步编程模式的死忠,当TAP模式和TPL模式出现的时候我并未真正的去接纳这两种模式,所以导致我一直没有花太多心思去整理这两部 ...

  6. 了解和使用DotNetCore和Blazor中的异步编程

    目录 介绍 您对异步编程了解什么? 那么,什么是异步编程? 我们什么时候应该使用它? 任务.线程.计划.上下文 到底是怎么回事? Asnyc编码模式 命名约定 异步任务模式 任务模式 事件模式 阻塞与 ...

  7. .NET中的异步编程——常见的错误和最佳实践

    目录 背景 async void 没有线程 Foreach和属性 始终异步 在这篇文章中,我们将通过使用异步编程的一些最常见的错误来给你们一些参考. 背景 在之前的文章中,我们开始分析.NET世界中的 ...

  8. C#中的异步编程(Async)

    文章目录 C#中的异步编程(Async) 前言 示例代码 C#中的异步编程(Async) 前言 所谓的异步,就是指代码在运行的过程中,不会发生阻塞,例如我们玩游戏的时候,游戏在下载资源或者在加载本地资 ...

  9. python异步_Python中的异步编程

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. Quora的使命就是分享和增加全世界的知识,并且为了达到这个使命,我们不断地推出改进来让Quora对于我们 ...

最新文章

  1. django drf Filter
  2. 45.JVM调优策略、常见问题:内存泄漏(年老代堆空间被占满、持久代被占满、堆栈溢出、线程堆栈满、系统内存被占满)优化方法:优化目标、优化GC步骤、优化总结;案例分析(公司系统参数、网上给的配置参数)
  3. 最常用的6种原型文件格式对比
  4. 1、MapReduce理论简介
  5. Photon Release 4.8.0汉化(附图教程)
  6. SpringBoot 2.0.0 注入SpingCloud 有bug(目前只有SpringBoot 1.5+ 版本的支持)
  7. html页面插歌,怎样在HTML播放器里插入歌曲
  8. 实对称矩阵的特征值求法_MIT—微分方程与线性代数笔记6.5 对称矩阵,实特征值,正交特征向量...
  9. CAD插件学习系列教程(四) 一款轻量级的CAD里程标注插件
  10. 游戏Gala—基于星际文件系统的非中心化游戏
  11. PSPNet | 语义分割及场景分析
  12. java 获取拼音_Java获取汉字对应的拼音(全拼或首字母)
  13. Prioritizing Web Usability
  14. linux死机日志文件,linux系统死机分析及解决方法
  15. win7计算机无法识别分辨率,window7分辨率显示不正常
  16. 《般若波罗蜜多心经》全文及解释
  17. 【数据库设计】学籍管理的数据库系统
  18. 苹果12轻点背面不灵敏如何解决
  19. 永恒之塔linux服务端,【永恒之塔单机5.8-6.5服务端】2020.06首发一键安装PC大型端游单机游戏客户端支持局域网联机玩[附视频搭建教程]...
  20. VIPL Lab 9篇ACM MM 2019和IEEE TIP 论文精解

热门文章

  1. 雨滴桌面时间插件_只需要五步,让你的桌面变得干净漂亮
  2. python中encode与decode编码转换
  3. Flink SQL 1.11 新功能与最佳实践
  4. 几种字符串到byte[] 数组转化为String 的方法
  5. 漫步最优化二十三——一维优化
  6. python 获取键盘输入、同时有超时的功能_python 获取键盘输入,同时有超时的功能示例...
  7. 变分法理解2——基本方法
  8. Linux学习笔记12——配置ftp、squid、Tomcat、Samba、MySQL主从
  9. Linux学习笔记10
  10. 【实践驱动开发3-003】TI WL1835MODCOM8 在android的移植 - 软件获取2