首页 > 其他分享 >协程

协程

时间:2023-03-03 23:00:40浏览次数:37  
标签:__ 协程 print async def asyncio

 

import asyncio
import time

# 协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。
# 简而言之,其实就是通过一个线程实现代码块相互切换执行
# asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。


# asyncio def func():
#     print("hello,world")
#
# if __name__ == '__main__':
#     g = func() # 此时的函数是异步协程函数,此时函数执行得到的是一个协程对象
#     asyncio.run(g) # 协程程序运行需要asyncio模块的支持

# async def func1():
#     print("1111")
#     # time.sleep(3)  # 当程序出现了同步操作的时候,异步就中断了
#     await asyncio.sleep(3)
#     print("1111")
#
#
# async def func2():
#     print("2222")
#     # time.sleep(3)
#     await asyncio.sleep(2)
#     print("2222")
#
#
# async def func3():
#     print("3333")
#     # time.sleep(3)
#     await asyncio.sleep(4)
#     print("3333")


# if __name__ == '__main__':
#     f1 = func1()
#     f2 = func2()
#     f3 = func3()
#
#     tasks = [
#         f1, f2, f3
#     ]
#     t1 = time.time()
#     # 一次性启动多个任务(协程)
#     asyncio.run(asyncio.wait(tasks))
#     t2 = time.time()
#     print(t2 - t1)


'''
async 关键字
    协程函数:定义函数时候由async关键字装饰的函数 async def 函数名
    协程对象:执行协程函数得到的协程对象。

协程函数
    async def func():
        pass
协程对象
    result = func()
    注意:执行协程函数只会创建协程对象,函数内部代码不会执行。
    如果想要运行协程函数内部代码,必须要将协程对象交给事件循环来处理。
    
    import asyncio
    
    async def func():
        print("执行协程函数内部代码!")
    result = func()

    # 调用方法1:# python3.6及以下版本写法
        loop = asyncio.get_event_loop()
        loop.run_until_complete( result )
        loop.close()

    # 调用方法2: # python3.7才支持这种写法,作为一个入口函数
        asyncio.run(result)
        
await 关键字
    await + 可等待的对象(协程对象、Future、Task对象 -> IO等待),遇到IO操作挂起当前协程(任务),等IO操作完成之后再继续往下执行。
    当前协程挂起时,事件循环可以去执行其他协程(任务)。

Task 对象
    Task对象的作用是在事件循环中添加多个任务,用于并发调度协程,
    通过asyncio.create_task(协程对象)的方式创建Task对象,这样可以让协程加入事件循环中等待被调度执行。
    也可以写个函数:
       async def main():
            takes = [
                asyncio.create_task(func1()),
                asyncio.create_task(func2()),
                asyncio.create_task(func3()),
            ]
        if __name__ == '__main__':
            # 一次性启动多个任务(协程)
            asyncio.run(main())
'''


async def func1():
    print("1111")
    await asyncio.sleep(3)  # 耗时操作
    print("1111")


async def func2():
    print("2222")
    await asyncio.sleep(2)  # 耗时操作
    print("2222")


async def func3():
    print("3333")
    await asyncio.sleep(4)  # 耗时操作
    print("3333")


async def main():
    # 第一种写法
    # f1 = func1()
    # await f1 # 一般await挂起操作放在协程对象前面

    takes = [
        asyncio.create_task(func1()),
        asyncio.create_task(func2()),
        asyncio.create_task(func3()),
    ]
    # print(takes)
    # asyncio.run(asyncio.wait(takes))
    await asyncio.wait(takes)


if __name__ == '__main__':
    t1 = time.time()
    # 一次性启动多个任务(协程)
    asyncio.run(main())
    t2 = time.time()
    print(t2 - t1)

标签:__,协程,print,async,def,asyncio
From: https://www.cnblogs.com/Wesuiliye/p/17177296.html

相关文章

  • Go组件库总结之协程睡眠唤醒
    本篇文章我们用Go封装一个利用gopark和goready实现协程睡眠唤醒的库。文章参考自:https://github.com/brewlin/net-protocol1.gopark和goready的声明//go:linknamegopark......
  • 【读书笔记&个人心得】第13章:协程 (goroutine) 与通道 (channel)
    协程(goroutine)与通道(channel)Go语言为构建并发程序的基本代码块是协程(goroutine)与通道(channel)。他们需要语言,编译器,和runtime的支持。Go语言提供的垃圾......
  • 协程与asyncio
    1.协程协程不是计算机提供的,程序员人为创造的用户态的上下文切换技术2.asyncio在python3.4及之后的版本支持2.1事件循环理解成一个死循环,检测并执行某些代码#伪代......
  • [Unity/C#]委托+协程,依次启动多播委托里协程的方法
    1//委托的定义2publicdelegateIEnumeratorActiveDuringTurn(Player[]otherplayers);34publiceventActiveDuringTurnUEvent;567//依次启动协程......
  • Python 异步: 等待有时间限制的协程(12)
    我们可以使用asyncio.wait_for()函数等待asyncio任务或协程超时完成。如果在任务完成之前超时已过,任务将被取消。1.什么是Asynciowait_for()asyncio.wait_for()......
  • python 协程
    协程Python中的协程和生成器很相似但又稍有不同。主要区别在于: 生成器是数据的生产者 协程则是数据的消费者首先我们先来回顾下生成器的创建过程。我们可以这样去创建......
  • Go语言并发编程:对进程、线程、协程和并发、并行的理解
    Go语言并发编程:进程、线程、协程和并发、并行的理解一、进程和线程对操作系统进程和线程以及协程的了解,可以看看我前面的文章:对进程、线程和协程的理解以及它们的区别......
  • 一文了解Python协程本质
    关于Python协程我觉得当你学到一定程度的时候一定要懂,比如你在对代码进行优化或者提升速度时,就不得不使用异步编程,加上现在有很多的优秀第三方库都可以实现异步编程,从而让......
  • Python 异步: 同时运行多个协程(10)
    asyncio的一个好处是我们可以同时运行许多协程。这些协同程序可以在一个组中创建并存储,然后同时一起执行。这可以使用asyncio.gather()函数来实现。让我们仔细看看。1......
  • 协程
    一、协程概念协程又称微线程(纤程),是一种用户态的轻量级线程子程序在所有的语言中都是层级调用的,比如A中调用B,B在执行过程中调用C,C执行完返回,B执行完返回,最后是A......