async异步编程屏蔽凡人
为提高效率与增加逼格,墙裂建议引入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. 要写好注释,很多代码隔一段时间就不知道是什么意思了,更何况是异步的。
分类:
7. 异步编程篇
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架