[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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157818.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Sphinx + Coreseek 实现中文分词搜索

    Sphinx + Coreseek 实现中文分词搜索

  • CVE-2014-0160:心脏出血(心血)漏洞

    CVE-2014-0160:心脏出血(心血)漏洞0x00漏洞介绍是一个出现在加密程序库OpenSSL的安全漏洞,该程序错误属于缓冲区过读,即可以读取的数据比应该允许读取的还多0x01漏洞成因由于未能在memcpy()调用受害用户输入内容作为长度参数之前正确进行边界检查。攻击者可以追踪OpenSSL所分配的64KB缓存、将超出必要范围的字节信息复制到缓存当中再返回缓存内容,这样一来受害者的内存内容就会以每次64KB的速度进行泄露0x02…

  • 获取apk签名

    获取apk签名Apk签名相关方法一1.解压apk2.在META_INF目录下找到xxx.RSA文件3.执行keytool-printcert-filexxxx.RSA目录方法二keytool-list-v-keystorexxxx.keystore-storepass签名文件密码debug签名密码默认为android…

  • Python玫瑰花绘制「建议收藏」

    Python玫瑰花绘制「建议收藏」刚开始学Python,画个玫瑰花练练手,正好今天也是情人节我自认为还是挺好看的,感觉比我搜到的那几个画出来的强代码如下importturtleastt.setup(1100,1000)t.hideturtle()t.speed(11)t.penup()t.goto(50,-450)t.pensize(5)t.pencolor("black")t.seth(140)t…

  • JAX-WS SOA杂谈

    JAX-WS SOA杂谈[b][size=medium]代码优先[/size][color=blue]先编写类,通过注解定义wsdl的各项属性,基于类来生成wsdl文件[/color][size=medium]契约优先[/size][color=blue]先制定标准,与其它系统一起定义一个统一的标准,实现系统之间数据传输的规范性,即先有wsdl再有类[/color][size=me…

  • VMware Ubuntu虚拟机忘记密码「建议收藏」

    前言:在VMware运行Ubuntu虚拟机时,开机之后忘记密码怎么办?环境:Ubuntu版本:ubuntu-16.04.6-server-amd64;VMware版本:14.1.1build-7528167解决办法:1,重启Ubuntu虚拟机,长按shift(要选中虚拟机哦),进入如下界面2,上下箭头选择AdvancedoptionsforUbuntu,enter…

发表回复

您的电子邮箱地址不会被公开。

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