对py&node异步的一些理解

py的async和await是不同的

py的async是yield from实现的,py的异步是靠协程实现的。多个async函数之间是单线程异步的,当遇到await是,外部async函数先返回,执行其他async函数。demo中通过main中await多个async函数,实现整体的同步。

demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import time
import asyncio
async def taskIO_1():
print('开始运行IO任务1...')
await asyncio.sleep(2) # 假设该任务耗时2s
print('IO任务1已完成,耗时2s')
return taskIO_1.__name__
async def taskIO_2():
print('开始运行IO任务2...')
await asyncio.sleep(3) # 假设该任务耗时3s
print('IO任务2已完成,耗时3s')
return taskIO_2.__name__
async def main(): # 调用方
tasks = [taskIO_1(), taskIO_2()] # 把所有任务添加到task中
done,pending = await asyncio.wait(tasks) # 子生成器
for r in done: # done和pending都是一个任务,所以返回结果需要逐个调用result()
print('协程无序返回值:'+r.result())

if __name__ == '__main__':
start = time.time()
loop = asyncio.get_event_loop() # 创建一个事件循环对象loop
try:
loop.run_until_complete(main()) # 完成事件循环,直到最后一个任务结束
finally:
loop.close() # 结束事件循环
print('所有IO任务总耗时%.5f秒' % float(time.time()-start))

node首先需要理解Promise,Promise内部是异步的,Promise之间是同步的。可以通过Promise.all()将多个Promise变成异步的。Promise.then将多Pormise对象同步执行,成功继续then,失败到catch。Promise有两个状态,resolve和rejected,在定义Promise对象是实现对应的处理。

node的async返回的是一个Promise对象,因此async函数可以.then,只有等到async函数内部操作执行完,才会调用then指定的回调函数。当async函数执行时,遇到await时,外部async函数会先返回,单线程继续执行其他的async函数,等到await函数的io操作完成,再接着执行async函数体内后面的内容。

Proudly powered by Hexo and Theme by Hacker
© 2021 LFY