asynchronous programing异步编程基础

Arya Lv3

前言✨

说到异步编程不得不提到yield这个关键字。yield相当于return,用于函数的返回,可以返回某个值也可以直接作为结束函数的返回,但是yield和return不同的是,yield可以从上次程序结束的地方开始重新运行。

在执行yield所在的函数时,首先并不会直接执行函数,而是会生成一个生成器。然后运行next()方法,函数才开始正式执行,在执行函数过程中遇到了yield关键字,函数进行return并且暂停,再次运行next()方法后程序从上次结束的地方开始运行。

这便为异步编程打下了基础,我们在一个函数执行等待的期间,添加一个yield关键字,让它跳出函数执行,执行其他的函数,然后执行完后再从上一次的位置继续执行,就加快了程序整体的运行时间,避免了浪费,实现了异步效果。

举个🌰:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import time
from datetime import datetime
def print_message_periodical(interval_seconds,message='keep alive'):
while True:
print("{}-{}".format(datetime.now(),message))
start=time.time()
end=start+interval_seconds
while True:
yield
now=time.time()
if now>end:
break

if __name__=="__main__":
a=print_message_periodical(3,'three')
b=print_message_periodical(10,'ten')
stack=[a,b]
while True:
for task in stack:
next(task)

上面的例子是一个计时打印的例子,利用yield关键字。在等待3秒和等待10秒的两个函数中不停切换,实现异步编程。

上面的代码可以用python内置的asyncio进行转写,在需要进行异步的函数前面加上关键字asyncio,然后yield语句替换为await asyncio.sleep(0),用库中的get_event_loop()方法对异步程序进行循环,创建异步循环任务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import time
from datetime import datetime
import asyncio
async def print_message_periodical(interval_seconds,message='keep alive'):
while True:
print("{}-{}".format(datetime.now(),message))
start=time.time()
end=start+interval_seconds
while True:
await asyncio.sleep(0)
now=time.time()
if now>end:
break

if __name__=="__main__":
scheduler=asyncio.get_event_loop()
scheduler.create_task(
print_message_periodical(3,'three')
)
scheduler.create_task(
print_message_periodical(10,'ten')
)

代码参考来自:麦兜搞IT的教程
异步编程概念参考来自:python中yield的用法详解——最简单,最清晰的解释

  • 标题: asynchronous programing异步编程基础
  • 作者: Arya
  • 创建于 : 2023-11-13 18:00:00
  • 更新于 : 2023-11-15 17:06:00
  • 链接: https://aryagala0.github.io/2023/11/13/python基础/asyn异步编程基础/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论
此页目录
asynchronous programing异步编程基础