本文主要介绍python的异步编程,具有一定的参考价值。感兴趣的朋友可以参考一下,希望能给你带来帮助。br。
目录
一、异步编程概述二。python III的异步框架模型。多个重叠任务的顺序执行。异步同步代码五、利用多线程克服特定任务异步限制概述
一、异步编程概述
异步编程是一种并发编程模式,其重点是通过调度不同任务之间的执行和等待时间,减少处理器的空闲时间,从而减少整个程序的执行时间。异步编程和同步编程模型的最大区别是任务切换。当我们遇到一个需要等待很长时间才能执行的任务时,我们可以切换到其他任务。
与多线程、多进程编程模型相比,异步编程只是同一个线程内的任务调度,无法充分利用多核CPU的优势,因此特别适合IO阻塞任务。
Python版本3.9.5
二、python的异步框架模型
Python提供了asyncio模块来支持异步编程,其中涉及到三个重要概念:协程、事件循环和未来。
Event loops主要负责跟踪调度所有异步任务,安排特定任务在某个时间点执行;
协程是对具体执行任务的封装,是一种特殊类型的函数,可以在执行过程中暂停和切换到事件循环执行过程;一般还需要创建一个由事件循环调度的任务;
Futures负责承载协程的执行结果,协程是随着事件循环中任务的初始化而创建的,随着任务的执行记录任务的执行状态;
异步编程框架的整个执行过程涉及到三者的密切配合;
第一,事件循环启动后,从任务队列中获取第一个要执行的协程,并据此创建相应的任务和future
然后,随着任务的执行,当任务需要在协程内部进行切换时,任务的执行将被挂起,执行线程将被释放到事件循环中,事件循环随后将获取下一个要执行的协程,并在相关初始化后执行该任务;
事件循环执行后,队列中的最后一个协程将被切换到第一个协程;
随着任务执行的完成,事件循环会将任务从队列中清除,相应的执行结果会同步到未来,一直持续到所有任务完成;
三、顺序执行多个可重叠的任务
每个任务在执行过程中会暂停给定的时间,顺序执行时间是每个任务执行时间的总和;
导入时间
定义倒计时(名称,延迟):
indents=(ord(name)-ord(' A ')* ' \ t '
n=3
而n:
time.sleep(延迟)
duration=time.perf_counter() -开始
打印('-' * 40)
print(f ' { duration: 4f } \ t { indents } { name }={ n } ')
n -=1
start=time.perf_counter()
count_down('A ',1)
count_down('B ',0.8)
count_down('C ',0.5)
打印('-' * 40)
打印(“完成”)
# -
# 1.0010 A=3
# -
# 2.0019 A=2
# -
# 3.0030 A=1
# -
# 3.8040 B=3
# -
# 4.6050 B=2
# -
# 5.4059 B=1
# -
# 5.9065 C=3
# -
# 6.4072 C=2
# -
# 6.9078 C=1
# -
#完成
四、异步化同步代码
Python在语法上提供了两个关键字,async和await,以简化同步代码到异步的修改;
Async用在函数的def关键字前面,以表示它是一个协程函数;
Await在conroutine中用于标记执行过程需要暂停并释放给事件循环;
await后的表达式需要返回可等待的对象,如conroutine、task、future等。
Asyncio模块主要提供操作事件循环的方式;
我们可以通过异步非同步(异步)将倒计时标记为协程,然后使用等待和睡眠来实现异步的暂停,从而将控制权交给事件循环;
异步定义递减计数(名称、延迟、开始):
indents=(ord(name)-ord(' A ')* \ t '
n=3
而n:
等待异步睡眠(延迟)
duration=time.perf_counter() -开始
打印('-' * 40)
打印(f '持续时间:4f } \ t { indents } { name }={ n } ')
n -=1
我们定义一个异步的主要的方法,主要完成工作的创建和等待任务执行结束;
异步定义main():
start=time.perf_counter()
tasks=[asyncio。create _ task(count _ down(name,delay,start)) for name,delay in [('A ',1),(' B ',0.8),(' C ',0.5)]]
wait asyncio.wait(任务)
打印('-' * 40)
打印("完成")
执行我们可以看到时间已经变为了执行时间最长的任务的时间了;
asyncio.run(main())
# -
# 0.5010 C=3
# -
# 0.8016 B=3
# -
# 1.0011 A=3
# -
# 1.0013 C=2
# -
# 1.5021 C=1
# -
# 1.6026 B=2
# -
# 2.0025 A=2
# -
# 2.4042 B=1
# -
# 3.0038 A=1
# -
#完成
五、使用多线程克服具体任务的异步限制
异步编程要求具体的任务必须是协程,也就是要求方法是异步的,否则只有任务执行完了,才能将控制权释放给事件循环;
大蟒中的并发。未来提供了ThreadPoolExecutor和ProcessPoolExecutor,可以直接在异步编程中使用,从而可以在单独的线程或者进程至今任务;
导入时间
进口异步
从并行未来导入线程池执行器
定义倒计时(名称、延迟、开始):
indents=(ord(name)-ord(' A ')* \ t '
n=3
而n:
时间.睡眠(延迟)
duration=time.perf_counter() -开始
打印('-'*40)
打印(f '持续时间:4f } \ t { indents } { name }={ n } ')
n -=1
异步定义main():
start=time.perf_counter()
loop=asyncio.get_running_loop()
executor=ThreadPoolExecutor(max _ workers=3)
fs=[
loop.run_in_executor(executor,count_down,*args) for args in [('A ',1,start),(' B ',0.8,start),(' C ',0.5,start)]
]
等待asyncio.wait(fs)
打印('-'*40)
打印('完成)
asyncio.run(main())
# -
# 0.5087 C=3
# -
# 0.8196 B=3
# -
# 1.0073 A=3
# -
# 1.0234 C=2
# -
# 1.5350 C=1
# -
# 1.6303 B=2
# -
# 2.0193 A=2
# -
# 2.4406 B=1
# -
# 3.0210 A=1
# -
#完成。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。