python 中的 asyncio 异步协程
作者:autofelix 发布时间:2022-09-15 12:30:53
标签:python,asyncio,异步,协程
一、定义协程
asyncio 执行的任务,称为协程,但是Asyncio 并不能带来真正的并行
Python 的多线程因为 GIL(全局解释器锁)的存在,也不能带来真正的并行
import asyncio
# 通过 async 定义一个协程
async def task():
print('这是一个协程')
# 判断是否是一个协程,返回True
print(asyncio.iscoroutinefunction(task))
二、运行协程
import asyncio
# 通过 async 定义一个协程
async def task(s):
print('请等待 {} 秒'.format(s))
await asyncio.sleep(s)
print('协程结束')
# 协程运行
loop = asyncio.get_event_loop()
loop.run_until_complete(task(3))
三、协程回调
加入我们处理完协程任务后,需要告诉开发人员,这里程序结束了
就需要使用到协程回调
import asyncio
# 通过 async 定义一个协程
async def task(s):
print('请等待 {} 秒'.format(s))
await asyncio.sleep(s)
return '这里task结束了,其他的继续吧'
def callback(future):
print(future.result())
future = asyncio.ensure_future(task(3))
future.add_done_callback(callback)
loop = asyncio.get_event_loop()
loop.run_until_complete(future)
# 结果如下:
# 请等待 3 秒
# 这里task结束了,其他的继续吧
四、运行多个协程
常常同一个项目中有多个协程
需要借助
asyncio.gather
函数运行
import asyncio
# 通过 async 定义一个协程
async def task1(s):
print('请等待 {} 秒'.format(s))
await asyncio.sleep(s)
print('这里task1结束了')
# 通过 async 定义一个协程
async def task2(s):
print('请等待 {} 秒'.format(s))
await asyncio.sleep(s)
print('这里task2结束了')
# 运行方法一
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(task1(1), task2(3)))
# 运行方法二
coros = [task1(1), task1(3)]
loop.run_until_complete(asyncio.gather(*coros))
# 结果如下:
# 请等待 1 秒
# 请等待 3 秒
# 这里task1结束了
# 这里task2结束了
五、run_forever
通过
run_until_complete
运行协程,协程运行完,程序也就结束退出了使用
run_forever
运行,程序并不会退出,除非调用loop.stop()
import asyncio
# 通过 async 定义一个协程
async def task(s):
await asyncio.sleep(s)
# 程序并未退出结束
loop = asyncio.get_event_loop()
asyncio.ensure_future(task(3))
loop.run_forever()
如果想让其退出,需要调用
loop.stop()
我们可以在协程中调用
import asyncio
# 通过 async 定义一个协程
async def task(loop, s):
await asyncio.sleep(s)
# 关闭run_forever
loop.close()
loop = asyncio.get_event_loop()
asyncio.ensure_future(task(loop, 3))
loop.run_forever()
六、多协程中关闭run_forever
单个协程中可以通过在协程中关闭,但是如果是两个以上的协程的时候
如果有一个协程先做完了就stop了,将会导致其他的协程也会异常退出,这肯定是不允许的
所以我们可以在回调函数中进行关闭
import asyncio, functools
async def task(x):
await asyncio.sleep(x)
print('这是协程任务')
def callback(loop):
loop.stop()
loop = asyncio.get_event_loop()
future = asyncio.gather(task(1), task(3))
future.add_done_callback(functools.partial(callback, loop))
loop.run_forever()
来源:https://blog.51cto.com/autofelix/5256821
0
投稿
猜你喜欢
- 前言这篇博文的目的是演示如何使用 OpenCV、Python 和面部标志对齐人脸。给定一组面部标志(输入坐标),我们的目标是将图像扭曲并转换
- 废话不多说,直接上代码吧!#python中,while语句用于循环执行程序,即在某个条件下,循环执行某段程序,以处理需要重复处理的相同任务。
- Python是一种开源的编程语言,可用于Web编程、数据科学、人工智能以及许多科学应用。学习Python可以让程序员专注于解决问题,而不是语
- 报错:Uncaught SyntaxError: Unexpected token o in JSON at position 1at JS
- 今天运行程序时报了SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSess
- MySQL是一款关系型数据库管理系统,是由Oracle旗下公司MySQL AB 公司开发,是在web方面最好的、最流行的关系型数据库软件应用
- 本文实例讲述了Python基于回溯法子集树模板解决选排问题。分享给大家供大家参考,具体如下:问题从n个元素中挑选m个元素进行排列,每个元素最
- 方法一: 在给出的输入CD-KEY(序列号)的界面中,输入你已经安装的windows server 2003 的CD-KEY(序列号)即可以
- 类的参数定义将conda环境设置为ai,conda activate ai这个文件的由来:由于在yolov1的pytorch实现的损失函数中
- 方法一:函数添加1 import sys2 查看sys.path3 添加sys.path.append("c:\\")方
- networkx是Python的一个包,用于构建和操作复杂的图结构,提供分析图的算法。图是由顶点、边和可选的属性构成的数据结构,顶点表示数据
- paramiko模块提供了ssh及sft进行远程登录服务器执行命令和上传下载文件的功能。这是一个第三方的软件包,使用之前需要安装。1 基于用
- 看下面的一组例子:alert(true.toString());alert(false.toString());alert(1.123.to
- zip即将多个可迭代对象组合为一个可迭代的对象,每次组合时都取出对应顺序的对象元素组合为元组,直到最少的对象中元素全部被组合,剩余的其他对象
- 一、软件测试大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必须要有相应的质量保证活动,而软件
- drop_duplicates为我们提供了数据去重的方法,那怎么得到哪些数据有重复呢?实现步骤:1、采用drop_duplicates对数据
- 效果图如下所示:实现代码如下:<!DOCTYPE html><html lang="zh-cn">
- Mysql的utf8编码最多3个字节,而Emoji表情或者某些特殊字符是4个字节。因此会导致带有表情的昵称插入数据库时出错。只要修改MySQ
- 什么是高阶函数高阶函数就是能够把函数当成参数传递的函数就是高阶函数,换句话说如果一个函数的参数是函数,那么这个函数就是一个高阶函数。高阶函数
- 1.Mysql中的数据类型varchar 动态字符串类型(最长255位),可以根据实际长度来动态分配空间,例如:varchar(100)ch