[python]异步 async

[python]异步 async#-*-encoding:utf-8-*-“””ankus@ModifyTime@Author@Version@Description————————————–2021/12/314:02xlgui21.0asynciopy3.8异步IO:就是发起一个IO操作(如:网络请求,文件读写等),这些操作一般是比较耗时的,不用等待它结束,可以继续做

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

# -*- 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.net/157818.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 怎么用dos命令打开计算机,如何使用DOS命令打开C盘下的文件夹dos如何打开文件夹…[通俗易懂]

    如何使用DOS命令在C驱动器下打开文件夹答案:Windows键+R打开并运行Entercmd,然后按Enter打开命令提示符程序.键入“cd..”dos命令进入c盘根目录,然后按Enter键返回上一个目录.输入“cd\”,然后按Enter.如何打开该文件夹将直接返回到C驱动器的根目录.在CMD程序中输入“d:”,然后按Enter键进入D驱动器.进入D驱动器后,输入“c…

    2022年4月15日
    121
  • JDK1.8下载、安装和环境配置教程

    JDK1.8下载、安装和环境配置教程一、下载安装包1.JDK1.8百度云下载路径:链接:https://pan.baidu.com/s/1ozCGy53AIeQIHWL6s9oAbw提取码:04lf网盘放的是jdk1.8版本中的1.8.0_152的版本2.如果大家想下载别的版本,可以去官网:www.oracle.com下载,进入官网页面,然后点击Downloads。…

    2022年6月12日
    34
  • 求二叉树的最长路径_某完全二叉树按层次输出,从左到右

    求二叉树的最长路径_某完全二叉树按层次输出,从左到右Ural 大学有 N 名职员,编号为 1∼N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 Hi 给出,其中 1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。输入格式第一行一个整数 N。接下来 N 行,第 i 行表示 i 号职员的快乐指数 Hi。接下来 N−1 行,每行输入一对整数 L,K,表示 K 是 L 的直接

    2022年8月8日
    4
  • 太极阳必须要root吗_root手机教程

    太极阳必须要root吗_root手机教程以前的root基本是suroot,但是su不再维护更新之后,就有了现在的比su更好玩的root手机的工具→magisk。Magisk具备很强大的模块扩展,可以不修改system区的文件,达到修改system文件一样的效果,例如换字体,换主题,换卡机界面,换gpu驱动等等。现在就来一个面具的刷入教程。1.一台可以解锁BL的手机(可以查看公众号的历史信息,刷机教程)2.给机器刷入第三方Re…

    2022年6月4日
    87
  • 最全的 Charles 抓包工具详解「建议收藏」

    最全的 Charles 抓包工具详解「建议收藏」本文介绍了详细介绍了Charles的HTTP/HTTPS抓包功能,其中包括模拟慢网速、断电功能、Compose功能、重写功能、映射功能、Repeat功能、以及Android7.0抓包问题

    2022年6月14日
    183
  • java乘法代码_java九九乘法表代码[通俗易懂]

    java乘法代码_java九九乘法表代码[通俗易懂]java九九乘法表代码发布时间:2020-05-2813:34:14来源:亿速云阅读:156作者:鸽子要实现输出99乘法表,我们可以通过两层for循环来实现。具体代码为:publicclassFor99{publicstaticvoidmain(String[]args){for(intm=1;m<=9;m++){for(inti=1;i<=m;i++){inta=…

    2022年7月15日
    13

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号