Python 中的异步 for 循环示例详解
作者:迹忆客 发布时间:2021-07-09 10:27:30
本篇文章将提供有关 Python 中异步 for 循环的完整详细信息。 我们将讨论异步函数、异步 for 循环和睡眠概念。
接下来,我们将讨论 Python 库 asyncio 和运行异步代码所需的函数。 最后,我们将看到几个 Python 示例,以充分理解这个概念。
Python 中的异步函数
异步函数有助于与同一程序的其他函数并行运行繁重的任务(如批处理程序,也许我们对在后台运行进程感兴趣)。 当函数不相互依赖或不完全相互依赖时,可以并行运行函数。
同步函数在任务完成后返回控制权,而异步函数返回控制权以并行运行其他函数/代码并在一段时间后取回控制权。 这样,不仅完成了繁重的任务,还并行完成了许多其他任务。
从技术上讲,同步函数会阻塞主函数的控制,而异步函数的执行不会阻塞主函数。 这样,主函数可以并行运行多个异步函数。
Python 中的异步 for 循环
对于同步循环,它们在没有任何暂停/给予控制的情况下执行; 但是,要使它们异步,我们必须在一些异步函数中定义它们。 此外,我们需要在这个过程中休眠一段时间,以控制其他一些功能。
使用睡眠语句
进程/线程/函数可能会休眠一段时间; 你可以考虑休息一下。 但是,目的是在一段时间内失去控制。
结果,其他一些功能获得了控制权。 一段时间后,控制返回,功能恢复。
现在,是时候转向 Python 中的实现了。 我们将逐步讨论语法部分,最后,我们将展示完整的代码。
Python 库和函数
asyncio
是 Python 中的一个库,用于使用 async/await 语法编写并发程序/函数。 async 是每个函数开头使用的关键字(用于创建异步函数)。
语法是:
async def fun_a(t):
这里加入了 async
,将这个函数声明为异步函数。
sleep 函数可以暂停协程的执行一段时间。 协程是在执行过程中构成管道结构的进程/函数。
该函数通过 await 关键字自愿离开 CPU 去执行另一个协作任务。 睡眠函数的语法是:
await asyncio.sleep(1)
await
关键字将控制权返回给事件循环。 您可能会考虑,如果使用 await
命令调用异步函数,则 sleep 语句(在 for 循环内)控制协作进程直到睡眠。
gather 函数将多个协作进程(技术上称为协程)组合起来作为一个单元运行。 此函数按照在 gather 调用中编写的函数的顺序返回结果元组。
语法是:
results = await asyncio.gather(fun_a(5), fun_b(5))
在这里,我们正在制作 fun_a 和 fun_b 的管道,以便它们可以同时运行。
事件循环是每个异步应用程序的主要组成部分。 事件循环运行异步函数。
get_event_loop()
方法检查是否尚未调用 set_event_loop ,它将创建一个事件循环并将其设置为当前。 语法是:
my_loop = asyncio.get_event_loop()
如果在循环已创建时再次执行此命令,则它不会执行任何操作。 但是,在第一次调用中,没有创建循环; 因此,它将创建一个异步循环。
如果 get_event_loop()
返回的循环是异步的,则 run_until_complete()
用于并发运行事件循环。 语法是:
my_loop.run_until_complete(main())
如果主函数是异步的,则此语句将并发运行代码。
异步代码
对运行异步函数/例程/进程所需的概念和 Python 库有了清晰的认识,是时候看一个完整的编码示例了:
import asyncio
async def fun_a(t):
for i in range(t):
print("fun_a", end=' ')
await asyncio.sleep(1)
return 1
async def fun_b(t):
for i in range(t):
print("fun_b", end=' ')
await asyncio.sleep(1)
return 2
async def main():
results = await asyncio.gather(fun_a(5), fun_b(5))
print(results)
my_loop = asyncio.get_event_loop()
my_loop.run_until_complete(main())
在这段代码的顶部(第一行),我们导入了 asyncio 库。 这个库有一个调用异步函数并发运行的必需函数; 他们已经用语法进行了讨论。
接下来,我们有两个异步函数—— fun_a
和 fun_b
,我们希望它们同时运行。 同样,我们想从主函数调用异步函数。 因此,main 也被创建为一个异步函数。
另外,请注意我们将 5 传递给我们的函数以在其中运行五次循环。 所以稍后,您可以看到输出并得到循环没有完全运行的想法; 每个都进入睡眠状态并控制另一个功能。
我们将在输出后重复这一点。
在 main 函数中,我们调用了 gather 函数并传递了我们的异步函数,以便它们可以并行运行。 gather 函数返回一个元组,它有两个从我们的目标异步函数返回的值。
我们终于来到了最后两行。 在倒数第二行,我们调用了 get_event_loop 函数来创建一个循环。 在最后一行,使用我们的循环,我们调用了 run_until_complete 函数来开始异步运行我们的主函数。
此代码的输出是:
fun_a fun_b fun_a fun_b fun_a fun_b fun_a fun_b fun_a fun_b [1, 2]
首先,请注意我们的循环并不完全像传统代码那样运行; 相反,两个循环同时运行。 您可以看到两个函数 print 语句的结果。
最后,[1, 2]
是主函数从我们的异步函数接收到的元组。 1 和 2 由我们的异步函数返回,并按照我们在 gather 函数中编写这些函数的顺序排列。
来源:https://blog.csdn.net/fengqianlang/article/details/130958222
猜你喜欢
- 笔者日积月累了许多精彩、实用的Web特效的制作,这些特效几乎都是比较常用的网页特效。现在我就把这些经过
- 起因前端日子写完的Python入库脚本,通过直接读取配置文件的内容(包含了数据库的ip,数据库的用户名,数据库的密码),因为配置文件中的数据
- innewDropList = [9,10,11,12,22,50,51,60,61]newDB = newDB[newDB['gr
- table估计每个跟web打过交道的人都会经常接触到,跟js结合能做出很多不错的体验。这里打算结合js做一个系列,包括一些操作和效果,虽然现
- 一、前言相关知识来自《python算法设计与分析》。初级排序算法是指几种较为基础且容易理解的排序算法。初级排序算法包括插入排序、选择排序和冒
- 前言中位数是一个可将数值集合划分为相等的上下两部分的一个数值。如果列表数据的个数是奇数,则列表中间那个数据就是列表数据的中位数;如果列表数据
- 1.背景一直苦恼于本地机器和服务器上都要配置一些机器学习方面的环境,今天花了点时间研究了下Jupter notebook远程访问服务器,所以
- 该 GIF 图来自于官网,文末有给出链接。描述依托于百度网盘巨大的的云存储空间,绝大数人会习惯性的将一些资料什么的存储到上面,但是有的私密链
- zyw147 提出问题:ASP读取指定xml 的节点?怎么用ASP《不是JS》取出指定的节点? 例如我想取出北京,我在ASP客户端提交的是
- 权限级别划分如下:①、院长和财务科长:不能输入,可以无限制查询、统计;②、副院长:不能输入,可以查询、统计其分管部门的帐务;③、部门领导:不
- 在Python中,语法错误可以被Python解释器发现,但逻辑上错误或变量使用错误却不容易发现,如果结果没有符合预期,则需要调试,一个很好的
- 调用bianli()函数,这里是遍历F:盘,bianli("F:\")'这里设置文件夹路径,你可以改为其它文件夹
- 本文实例讲述了python打开url并按指定块读取网页内容的方法。分享给大家供大家参考。具体实现方法如下:import urllibpage
- 前几天要写一个东西里面有用到读文件的。 可是我不想用FSO,我怕有的空间不支持。 &nbs
- 1、跳过迭代对象的开头string_from_file = """ // Wooden: ...
- 将一个 awk 脚本移植到 Python 主要在于代码风格而不是转译。脚本是解决问题的有效方法,而 awk 是编写脚本的出色语言。它特别擅长
- 前言Github源码地址本文同时也是学习唐宇迪老师深度学习课程的一些理解与记录。文中代码是实现在TensorFlow下使用卷积神经网络(CN
- 本文实例讲述了Python使用matplotlib 画矩形的三种方式。分享给大家供大家参考,具体如下:假设矩形两点坐标如下,分别为:x1,
- 支付宝lab的意思是支付宝实验室,也就是概念产品聚集地,可以让用户快速试用这些新产品。本次支付宝lab logo设计历时一个星期,视觉设计组
- 在日常的测试工作中,我们的测试用例一般都是保存在Excel文件中,当然也有一些公司会使用Xmind来编写测试用例,那么为什么我们在这里只是讲