[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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python查微信好友是否删除自己_微信 用脚本查看是否被微信好友删除 不用群发用Python脚本查微信被哪些好友删除…「建议收藏」

    python查微信好友是否删除自己_微信 用脚本查看是否被微信好友删除 不用群发用Python脚本查微信被哪些好友删除…「建议收藏」python3为什么不加锁也数据同步不安全,在多线程下并非一定同步。网上有的是例子可以证明,自己搜个试试看就知道了。用脚本快速查看自己被多少微信好友删除找自己删除的微信好友方法:尽管,生命中无数次的回头,也终究错过很多的故事,遗憾过,后悔过,遗憾了红尘中走过却没有带走些什么东西,后悔了一路走来却还是放下了一些东西。是的!一切就好像梦一场,但是梦醒后又想,好像曾经来过!第二种简单方法:如果该好友没…

    2022年6月3日
    41
  • SSM框架原理,作用及使用方法

    SSM框架原理,作用及使用方法作用:SSM框架是springMVC,spring和mybatis框架的整合,是标准的MVC模式,将整个系统划分为表现层,controller层,service层,DAO层四层使用springMVC负责请求的转发和视图管理spring实现业务对象管理,mybatis作为数据对象的持久化引擎原理:SpringMVC:1.客户端发送请求到DispacherServ

    2022年7月12日
    17
  • 浅析AnyCast网络技术「建议收藏」

    浅析AnyCast网络技术「建议收藏」什么是BGPAnyCast?BGPanycast就是利用一个(多个)as号码在不同的地区广播相同的一个ip段。利用bgp的寻路原则,短的aspath会选成最优路径(bgp寻路原则之n),从而优化了访问速度。其实bgpanycast是不同服务器用了相同的ip地址。阿里的DNS就是使用了BGPAnyCast“其实bgpanycast是不同服务器用了相同的ip地址。”言简意赅啊!D…

    2022年5月24日
    50
  • 目标检测的目的_小目标检测问题

    目标检测的目的_小目标检测问题我们在评价一个目标检测算法的“好坏”程度的时候,往往采用的是pascalvoc2012的评价标准mAP。网上一些资料博客参差不齐,缺乏直观易懂的正确说明。希望这篇博文能够给大家一点帮助。mAP历史目标检测的mAP计算方式在2010年的voc上发生过变化,目前基本都是采用新的mAP评价标准。(我有个小疑问就是明明是2010年修改的,但是貌似现在大家都称这种计算方式为2012)所…

    2022年10月12日
    2
  • html设置固定长度下划线

    html设置固定长度下划线<spanstyle=”border-bottom:2pxsolidblack;width:200px;display:-moz-inline-box;display:inline-block;”>bbbb</span>

    2022年6月3日
    86
  • vscode 使用flake8和yapf[通俗易懂]

    vscode 使用flake8和yapf[通俗易懂]vscode使用flake8和yapf

    2025年11月2日
    4

发表回复

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

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