• python协程详细解释以及例子


    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关键字实现协程

    import asyncio
    #使用该装饰器装饰后,该函数就是一个协程函数
    
    async def func1():
        print(1)
        #遇到IO操作时,会自动切换到tasks中的其他任务函数
        await asyncio.sleep(2)
        print(2)
    
    
    async def func2():
        print(3)
        await asyncio.sleep(2)
        print(4)
        
    #将两个协程函数封装成一个tasks列表
    tasks = [
        asyncio.ensure_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 已完成任务列表:
        从任务列表中删除
    
    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("执行协程函数内部代码")
      #遇到IO操作时会挂起当前协程任务,等IO操作完成后再继续往下执行,当前协程挂起时,时间循环对象可以执行其他协程任务
      re = await other()
      print("IO请求结束,结果为:",re)
      
    asyncio.run(func())
    
    #执行结果 
    执行协程函数内部代码
    start
    end
    IO请求结束,结果为: 1
    
    
  • 相关阅读:
    leetcode61 旋转链表
    代码随想录一一一数组一一一二分查找
    【电源设计】11变压器在开关电源中的应用
    Java经典问题解答(9题)
    神经网络和深度学习-梯度下降Gradient Descent
    maven教程
    博客项目(前后端分离)(servlet实战演练)
    vue3 tsx语法
    [elementuiPlus]el-select改变时触发el-input校验的解决方法
    投资 - 股市顺势加仓方式
  • 原文地址:https://www.cnblogs.com/szj666/p/17270574.html