深入理解python异步编程,python3 异步编程

深入理解python异步编程,python3 异步编程,详解python之异步编程

本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: