为提高效率与增加逼格,墙裂建议引入async异步编程,这不比基于threading的线程、基于multiprocessing的进程香?这些大家伙太重量级了,代码又啰里啰唆的一点也不pythonic,只有gevent协程能与之一战了,但async家族是python原生态的,故强烈建议采用async家族的异步来做异步编程。

一. 代码体现

  以异步计算为例做讲解。

import asyncio
import time def wrapper(fn):
def inner(*args, **kwargs):
t1 = time.time()
print("--正在努力计算--")
result = fn(*args, **kwargs) # 直接返回 coroutine对象,装饰它没有意义,所以这里直接运行了,所以时间为0.0,所以它整体上都是前置操作,只能增加前置操作,后置的操作没有意义。
print(time.time() - t1)
print('巴拉巴拉...')
return result return inner def calculate():
@wrapper # 装饰器套异步函数没有意义,但是可以用来装逼。
async def cal1(t=1, number=1000):
result = 0
while t:
for a in range(number + 1):
for b in range(number + 1):
if a ** 2 + b ** 2 == (number - a - b) ** 2:
result = a, b, number - a - b
print(result)
t -= 1
await asyncio.sleep(0.1) return result async def cal2(t=1, number=3000):
t1 = time.time()
print()
result = 0
while t:
for a in range(number + 1):
for b in range(number + 1):
if a ** 2 + b ** 2 == (number - a - b) ** 2:
result = a, b, number - a - b
print(result)
t -= 1
await asyncio.sleep(0.1)
print(time.time() - t1)
return result asyncio.get_event_loop().run_until_complete(asyncio.wait([cal1(), cal2()])) calculate()

二. 遵守几个不

  1. 不建议整个项目都采用异步的方式。不然会出现一处async,处处await的情况,加上人员掌握情况参差不齐,写出来的异步代码各有千秋,遇到复杂的逻辑就更烧脑了。

  2. 不建议给异步函数加装饰器。因为装饰器套在异步的头上起不了装饰的作用。可以看到再call函数的头上套了wrapper装饰器,运行结果证实了这个装饰是失败的。究其原因是因为装饰内部得到的是一个crontinue对象,这个对象不是同步执行的(从头到尾执行的),而是瞬间就没的(异步了)。

  3. 不要写没有await的异步函数,新手掌握不好容易反这些错,熟练后就好了。

三. 遵守几个要

  1. 要在合适的地方await。一些耗时的操作后面进行await,或者对某些步骤拆分进行await,这是非常有利于充分利用cpu资源的。

  2. 要把异步代码加在同步代码里。不是每个人都喜欢异步,很多人看到async重写的心都有了。合理的划分异步范围,对有必要进行异步的函数进行异步操作,不需要的就别逞能了。

  3. 要写好注释,很多代码隔一段时间就不知道是什么意思了,更何况是异步的。

async异步编程屏蔽凡人的更多相关文章

  1. 异步编程系列第01章 Async异步编程简介

    p { display: block; margin: 3px 0 0 0; } --> 2016.10.11补充 三个月过去了,回头来看,我不得不承认这是一系列失败的翻译.过段时间,我将重新翻 ...

  2. 在 .NET 4.0 下编写扩展代码以支持 async 异步编程

    微软在C# 5中引入了async.await这两个异步编程的关键字,要使用这两个关键字需要你的IDE支持C#5.0语法,也就意味着你需要使用VS 2012版本以上IDE,或者在Vs2010卸载其编译器 ...

  3. 第六节:前后端交互之axios用法及async异步编程

    一. axios用法 参考: API文档: https://www.kancloud.cn/yunye/axios/234845 GitHub: https://github.com/axios/ax ...

  4. 异步编程系列第02章 你有什么理由使用Async异步编程

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  5. nodejs之async异步编程

    1.什么是异步编程? 异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数.ajax请求等等. 示例:  for (v ...

  6. Async异步编程入门示例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. C#与C++的发展历程第三 - C#5.0异步编程巅峰

    系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 3. C#与C++的发展历程第三 - C#5.0异步编程的巅峰 C#5.0 ...

  8. 【.NET异步编程系列2】掌控SynchronizationContext避免deadlock

    引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供Task线程包装类和await/async异步编程语法糖简化了异步编程方式. 相信很多开发者都看到如下异步编程实践原 ...

  9. 探究SynchronizationContext在.Net异步编程中的地位

    原文:探究SynchronizationContext在.Net异步编程中的地位 引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供Task线程包装类和await/a ...

  10. 【异步编程】Part2:掌控SynchronizationContext避免deadlock

    引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供Task线程包装类和await/async异步编程语法糖简化了异步编程方式. 相信很多开发者都看到如下异步编程实践原 ...

随机推荐

  1. 系统内置APK并签名并配置AndroidStudio

    前言 最近在集成内置APK的时候遇到了些问题,遂整理一份文档以记录. 一,APP内置进系统固件 将APK源码或编译出的apk文件放在package或vendor等目录下,并且编写相应的android, ...

  2. Cesium-03:洪水淹没

    Cesium-01:Vue 中基础使用 Cesium-02:飞机模型简单点对点飞行 Cesium-03:洪水淹没 前言 最开始想做洪水淹没的话,查了一些资料.又基于不同的实现的,如 ArcScene ...

  3. day11 枚举类enum & 单例模式 & 异常以及抛出

    day11 枚举enum 用enum关键字定义枚举类 特点 1.用enum关键字定义枚举类 2.枚举类默认继承java.lang.Enum类 3.枚举类的构造方法只能使用private修饰,省略则默认 ...

  4. Velero 系列文章(一):基础

    概述 Velero 是一个开源工具,可以安全地备份和还原,执行灾难恢复以及迁移 Kubernetes 集群资源和持久卷. 灾难恢复 Velero 可以在基础架构丢失,数据损坏和/或服务中断的情况下,减 ...

  5. socet网络编程

    一. 网络模型 应用层   -----     HTTP协议 传输层   -----     TCP协议 网络层   -----       IP协议 链路层   -----     以太网协议 二. ...

  6. MSTN CE和MSTN SDK安装经验及技巧

    MSTN CE和MSTN SDK安装经验及技巧 本文介绍了MSTN CE及MSTN CE SDK安装的流程以及在安装时可能会遇到的问题 一.MSTN CE安装 1.MSTN CE即Microstati ...

  7. jQuery事件与动态效果

    目录 一:阻止后续事件执行 1.推荐使用阻止事件 2.未使用 阻止后续事件执行 3.使用阻止后续事件执行 二:阻止事件冒泡 1.什么是事件冒泡? 2.未阻止事件冒泡 3.阻止事件冒泡 4.2.阻止冒泡 ...

  8. Gorm源码学习-创建行记录

    1. 前言 Gorm源码学习系列 Gorm源码学习-数据库连接 此文是Gorm源码学习系列的第二篇,主要梳理下通过Gorm创建表的流程. 2. 创建行记录代码示例 gorm提供了以下几个接口来创建行记 ...

  9. uniapp微信小程序 原生底部导航栏

    在pages.json文件中写  "tabBar": { "color": "#333333", "selectedColor&q ...

  10. electron + go 如何从sqlite获取数据

    我现在的数据在sqlite中,保存在mac本地的一个文件中.用了electron+vue搭建了一个客户端. 我大概希望是这样的逻辑,先加载本地db文件,然后再获取数据. 这里就有一个问题,我怎么获取s ...