开发者

一文带你了解Python协程的详细解释以及例子

开发者 https://www.devze.com 2023-03-30 09:33 出处:网络 作者: 智健
目录1.协程1.1greenlet实现协程1.2yield关键字实现协程1.3使用asyncio模块实现协程1.4async & await关键字实现协程2.协程意义3.异步编程3.1时间循环3.2案例3.3await关键字1.协程
目录
  • 1.协程
    • 1.1greenlet实现协程
    • 1.2yield关键字实现协程
    • 1.3使用asyncio模块实现协程
    • 1.4async & await关键字实现协程
  • 2.协程意义
    • 3.异步编程
      • 3.1时间循环
      • 3.2案例
      • 3.3await关键字

    1.协程

    协程不是计算机提供的,计算机只提供:进程、线程。协程时人工创造的一种用户态切换的微进程,使用一个线程去来回切换多个进程

    实现协程的几种方法

    • greenlet:早期模块
    • yield关键字:可以保存代码,保存状态
    • asyncio装饰器(3.4)
    • async、await关键字(3.5)【推荐】

    1.1greenlet实现协程

    pip install greenlet
    
    from greenlet import greenlet
    def fun1():
      gre2.switch()#切换到fun2
      pass
    def fun2():
      gre1.switch()#切换到fun1
      pass
    gre1 = greenlet(func1)
    gre2 = greenlet(func2)
    gre1.switch()#先去执行fun1
    

    1.2yield关键字实现协程

    def func1():
        yield 1
        yield from func2()
        yield 2
        
    def func2():
        yield 3
        yield 4
    f1 = func1()
    for item in f1:
        print(item,end=" ")
        
    #打印结果
    1 3 4 2
    

    1.3使用asyncio模块实现协程

    再python3.4版本之后才可以用(不用安装,在标准库中)

    import asyncio
    #使用该装饰器装饰后,该函数就是一个协程函数
    @asyncio.coroutine
    def func1():
        print(1)
        #遇到IO操作时,会自动切换到taks中的其他任务函数
        yield from asyncio.sleep(2)
        print(2)
    
    @asyncio.coroutine
    def func2():
        print(3)
        yield from asyncio.sleep(2)
        print(4)
        
    #将两个协程函数封装成一个tasks列表
    tasks = [
        asyncio.ensure_future(func1()),
        asyncio.ensure_future(func2())
    ]
    #
    loop = asyncio.get_event_loop()
    loop.run_until_complete(func1())
    

    1.4async & await关www.devze.com键字实现协程

    import asyncio
    #使用该装饰器装饰后,该函数就是一个协程函数
    
    async def func1():
        print(1)
        #遇到IO操作时,会自动切换到tasks中的其他任务函数javascript
        await asyncio.sleep(2)
        print(2)
    
    
    async def func2():
        print(3)
        await asyncio.sleep(2)
        print(4)
        
    #将两个协程函数封装成一个tasks列表
    tasks = [
        asyncio.ensjsure_future(func1()),
        asyncio.ensure_future(func2())
    ]
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(tasks)
    

    2.协程意义

    在线程中如果遇到IO等待时间,线程不会傻等着,会利用空闲的时间去做其他事情,也就是进程异步执行。

    #协程请求资源使用第三方库aiohttp
    import aiohttp
    

    3.异步编程

    3.1时间循环

    理解成一个死循环,去检测并执行某些代码

    #伪代码
    任务列表 = [task1,task2...]
    while True:
      for 就绪任务 in 可执行任务列表:
        执行开发者_开发教程
      for 已完成任务 in 已完成任务列表:
        从任javascript务列表中删除
    
    import asyncio 
    
    #生成一个书简循环
    loop = asyncio.get_event_loop()
    #将任务放到任务列表中
    loop.run_until_complete(任务)
    

    3.2案例

    协程函数,

    定义函数的时候,用async def 函数名

    协程对象:执行协程函数的时候得到一个协程对象

    async def func():
      pass
    result = func()
    

    注意:执行协程函数时得到的协程对象,函数内部代码不会执行

    import asyncio
    async def func():
      print("哈喽")
    
    f = func()#协程对象
    
    loop = asyncio.get_event_loop()#创建循环对象
    loop.run_until_complete(f)#通过循环对象执行协程对象
    
    #python3.7可以直接
    asyncio.run(f)
    

    3.3await关键字

    await + 可等待的对象 {协程对象,Future对象,Task对象} (类似于I O 等待)

    import asyncio
    async def func():
      print("哈喽")
      re = await asyncio.sleep(2)
    	print(re)
    asyncio.run(func())
    

    await就是等待对象的值得到结果后再继续向下执行

    import asyncio
    async def other():
      print("start")
      await asyncio.sleep(2)
      print("end")
      return 1
    
    async def fun():
      print("执行协程函数内部代码")
      #遇到IjavascriptO操作时会挂起当前协程任务,等IO操作完成后再继续往下执行,当前协程挂起时,时间循环对象可以执行其他协程任务
      re = await other()
      print("IO请求结束,结果为:",re)
      
    asyncio.run(func())

    执行结果 

    执行协程函数内部代码

    start

    end

    IO请求结束,结果为: 1

    到此这篇关于一文带你了解Python协程的详细解释以及例子的文章就介绍到这了,更多相关Python协程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号