[python]异步 async
2023-06-13 09:12:47 时间
大家好,又见面了,我是你们的朋友全栈君。
# -*- encoding: utf-8 -*-
""" @Modify Time @Author @Version @Description ------------ ------- -------- ----------- 2021/12/3 14:02 xlgui2 1.0 asyncio py3.8 异步IO:就是发起一个IO操作(如:网络请求,文件读写等),这些操作一般是比较耗时的, 不用等待它结束,可以继续做其他事情,结束时会发来通知。 协程:又称为微线程,在一个线程中执行,执行函数时可以随时中断, 由程序(用户)自身控制,执行效率极高,与多线程比较,没有切换线程的开销和多线程锁机制。 # 重要的概念 1.事件循环 管理所有的事件,在整个程序运行过程中不断循环执行并追踪事件发生的顺序将它们放在队列中, 空闲时调用相应的事件处理者来处理这些事件。 2.Future Future对象表示尚未完成的计算,还未完成的结果 3.Task 是Future的子类,作用是在运行某个任务的同时可以并发的运行多个任务。 asyncio.Task用于实现协作式多任务的库,且Task对象不能用户手动实例化, 通过下面2个函数创建: asyncio.async() loop.create_task() 或 asyncio.ensure_future() run_until_complete(): 阻塞调用,直到协程运行结束才返回。参数是future, 传入协程对象时内部会自动变为future asyncio.sleep(): 模拟IO操作,这样的休眠不会阻塞事件循环, 前面加上await后会把控制权交给主事件循环,在休眠(IO操作)结束后恢复这个协程。 若在协程中需要有延时操作,应该使用 await asyncio.sleep(), 而不是使用time.sleep(),因为使用time.sleep()后会释放GIL,阻塞整个主线程, 从而阻塞整个事件循环。 """
import asyncio
async def coroutine_example():
print("start")
await asyncio.sleep(1)
print("end")
coro = coroutine_example()
print("get event loop")
loop = asyncio.get_event_loop()
"""Run the event loop until a Future is done."""
loop.run_until_complete(coro) # 阻塞调用,直到协程运行结束才返回。
print("over")
loop.close()
# -*- encoding: utf-8 -*-
""" @Modify Time @Author @Version @Description ------------ ------- -------- ----------- 2021/12/3 14:09 xlgui2 1.0 async 创建task # 创建Task loop.create_task(): 接收一个协程,返回一个asyncio.Task的实例,也是asyncio.Future的实例, 毕竟Task是Future的子类。 返回值可直接传入run_until_complete() 返回的Task对象可以看到协程的运行情况 """
import asyncio
async def coroutine_example():
print("start1")
await asyncio.sleep(1)
print('end1')
return 1
async def coroutine_example2():
print("start2")
await asyncio.sleep(1)
print('end2')
return 2
loop = asyncio.get_event_loop()
coro = coroutine_example()
coro2 = coroutine_example2()
task = loop.create_task(coro)
task2 = loop.create_task(coro2)
print('运行情况1:', task)
print('运行情况2:', task2)
loop.run_until_complete(task)
print('再看下运行情况1:', task)
print('再看下运行情况2:', task2)
loop.close()
# -*- encoding: utf-8 -*-
""" @Modify Time @Author @Version @Description ------------ ------- -------- ----------- 2021/12/3 14:21 xlgui2 1.0 获取协程返回值 有2种方案可以获取返回值。 第1种方案:通过task.result() 可通过调用 task.result() 方法来获取协程的返回值, 但是只有运行完毕后才能获取,若没有运行完毕,result()方法不会阻塞去等待结果, 而是抛出 asyncio.InvalidStateError 错误 第2种方案:通过add_done_callback()回调 """
import asyncio
##########################################################################
# ## 第1种方案:通过task.result()
""" async def coroutine_example(): await asyncio.sleep(1) return 1 loop = asyncio.get_event_loop() coro = coroutine_example() task = loop.create_task(coro) print('运行情况:', task) try: print('返回值:', task.result()) except asyncio.InvalidStateError: print('task状态未完成,捕获了 InvalidStateError 异常') loop.run_until_complete(task) print('再看下运行情况:', task) print('返回值:', task.result()) loop.close() """
##########################################################################
# ##第2种方案:通过add_done_callback()回调
def my_callback(future):
print('返回值:', future.result())
async def coroutine_example():
print("start")
await asyncio.sleep(1)
print("end")
return 1
loop = asyncio.get_event_loop()
coro = coroutine_example()
task = loop.create_task(coro)
task.add_done_callback(my_callback)
loop.run_until_complete(task)
loop.close()
# -*- encoding: utf-8 -*-
""" @Modify Time @Author @Version @Description ------------ ------- -------- ----------- 2021/12/3 14:46 xlgui2 1.0 控制任务 通过asyncio.wait()可以控制多个任务 asyncio.wait()是一个协程,不会阻塞,立即返回,返回的是协程对象。 传入的参数是future或协程构成的可迭代对象。最后将返回值传给run_until_complete()加入事件循环 """
import asyncio
async def coroutine_example(name):
print('正在执行name:', name)
await asyncio.sleep(3)
print('执行完毕name:', name)
loop = asyncio.get_event_loop()
tasks = [coroutine_example('task_' + str(i)) for i in range(9)] # 由协程构成的可迭代对象
wait_coro = asyncio.wait(tasks)
loop.run_until_complete(wait_coro)
loop.close()
# -*- encoding: utf-8 -*-
""" @Modify Time @Author @Version @Description ------------ ------- -------- ----------- 2021/12/3 15:54 xlgui2 1.0 多任务中获取返回值 方案1:需要通过loop.create_task()创建task对象,以便后面来获取返回值 方案2:通过回调add_done_callback()来获取返回值 """
# 下面代码asyncio.wait()中,参数传入的是由future(task)对象构成的可迭代对象
##############################################
# 方案1:需要通过loop.create_task()创建task对象,以便后面来获取返回值
""" import asyncio async def coroutine_example(name): print('正在执行name:', name) await asyncio.sleep(1) print('执行完毕name:', name) return '返回值:' + name loop = asyncio.get_event_loop() tasks = [loop.create_task(coroutine_example('Zarten_' + str(i))) for i in range(3)] wait_coro = asyncio.wait(tasks) loop.run_until_complete(wait_coro) for task in tasks: print(task.result()) loop.close() """
########################
# 方案2:通过回调add_done_callback()来获取返回值
import asyncio
def my_callback(future):
print('返回值:', future.result())
async def coroutine_example(name):
print('正在执行name:', name)
await asyncio.sleep(1)
print('执行完毕name:', name)
return '返回值:' + name
loop = asyncio.get_event_loop()
tasks = []
for i in range(3):
task = loop.create_task(coroutine_example('Zarten_' + str(i)))
task.add_done_callback(my_callback)
tasks.append(task)
wait_coro = asyncio.wait(tasks)
loop.run_until_complete(wait_coro)
loop.close()
更多 https://mp.weixin.qq.com/s/nW8pa1qYgBtGxolMWYH6kA
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157818.html原文链接:https://javaforall.cn
相关文章
- pycharm pro for mac(Python编辑开发安装包)中文激活版下载
- python win32api messagebox_如何在Python中使用Win32 API?
- python qt是什么_初识Python与Qt「建议收藏」
- python编程是啥-Python编程「建议收藏」
- python人工智能学习笔记_[Python] 人工智能与自然语言处理学习笔记(1)[通俗易懂]
- python 生成exe,脱离python环境运行
- 关于获取每个月第几周的第一天是周几和最后一天是几号 python
- python常见运维脚本_Python运维常用脚本[通俗易懂]
- 【说站】python HTTP和HTTPS的不同
- 【说站】python计算在月球的体重
- 【说站】python PyQt创建上下文菜单
- Python:利用python代码编程实现将视频的avi格式转换为MP4格式
- Python编程经典案例【考题】判断日期是该年中的第几天
- python递归函数讲解_Python递归函数实例讲解
- Python 异步: 创建和运行异步任务(7)
- Python 异步: 同时运行多个协程(10)
- 【python】字典超详解
- python将png图片转换为jpeg图片详解编程语言
- python抓取图片示例详解编程语言
- Python调用C/C++程序详解编程语言
- Python socket编程详解编程语言
- 掌握Linux环境下的Python编程(linux执行python)
- Python中int()函数的用法
- Python如何连接MySQL数据库(python怎么连接mysql数据库)
- Python中使用MySQL数据库的操作技巧(mysql_python)
- python模拟新浪微博登陆功能(新浪微博爬虫)
- python处理文本文件实现生成指定格式文件的方法