zoukankan      html  css  js  c++  java
  • python异步--async与await使用

    python在3.5以后引入async和await来强化自身的异步编程,提升效率。今天只是简单的介绍下async和await的使用以及作用。至于原理性的东西以后会在写文章解释

    首先先看一个例子

    import requests,asyncio,time
    
    
    #async申明此函数是异步函数,区别于原来的普通函数
    async def test2(i):
         r = await other_test(i)
         print(i,r)
    
    
    async def other_test(i):
         r = requests.get(i)
         print(i)
    
         """
         1.await的作用是挂起函数,等待函数操作完成,这时候回去执行其他的异步函数,而不是傻等
         2.等挂起的函数执行完成以后将会从其他异步函数处返回,执行挂起结束的函数
         3.await只可以对异步函数使用,普通函数使用会报错
         """
         await asyncio.sleep(4)
         print(time.time()-start)
         return r
    
    url = ["https://segmentfault.com/p/1210000013564725",
           "https://www.jianshu.com/p/83badc8028bd",
           "https://www.baidu.com/"]
    
    #开启一个循环事件
    loop = asyncio.get_event_loop()
    
    #使用futur封装异步函数,以便后去使用loop执行性
    task = [asyncio.ensure_future(test2(i)) for i in url]
    start = time.time()
    
    #循环事件开始执行并监听taks任务,在这个时候异步的函数才会真正的被执行
    loop.run_until_complete(asyncio.wait(task))
    endtime = time.time()-start
    print(1111,endtime)
    
    #关闭循环事件
    loop.close()
    
    
    #运行结果
    #https://segmentfault.com/p/1210000013564725
    #https://www.jianshu.com/p/83badc8028bd
    #https://www.baidu.com/
    #4.535935163497925
    #https://segmentfault.com/p/1210000013564725 <Response [200]>
    #4.798289060592651
    #https://www.jianshu.com/p/83badc8028bd <Response [403]>
    #5.0793280601501465
    #https://www.baidu.com/ <Response [200]>
    #1111 5.079607248306274

    总结:

      1.正常的函数在执行时是不会中断的,所以你要写一个能够中断的函数,就需要添加async关键。

      2.async 用来声明一个函数为异步函数,异步函数的特点是能在函数执行过程中挂起,去执行其他异步函数,等到挂起条件(假设挂起条件是sleep(5))消失后,也就是5秒到了再回来执行。

      3.await 用来用来声明程序挂起,比如异步程序执行到某一步时需要等待的时间很长,就将此挂起,去执行其他的异步程序。await 后面只能跟异步程序或有__await__属性的对象,因为异步程序与一般程序不同。假设有两个异步函数async a,async b,a中的某一步有await,当程序碰到关键字await b()后,异步程序挂起后去执行另一个异步b程序,就是从函数内部跳出去执行其他函数,当挂起条件消失后,不管b是否执行完,要马上从b程序中跳出来,回到原程序执行原来的操作。如果await后面跟的b函数不是异步函数,那么操作就只能等b执行完再返回,无法在b执行的过程中返回。如果要在b执行完才返回,也就不需要用await关键字了,直接调用b函数就行。所以这就需要await后面跟的是异步函数了。在一个异步函数中,可以不止一次挂起,也就是可以用多个await。

  • 相关阅读:
    [leetcode-79-Word Search]
    [leetcode-563-Binary Tree Tilt]
    [leetcode-561-Array Partition I]
    [leetcode-556-Next Greater Element III]
    [leetcode-554-Brick Wall]
    [leetcode-557-Reverse Words in a String III]
    [leetcode-532-K-diff Pairs in an Array]
    dev 官网
    DataTable 设置primarykey 后进行 Merge操作
    对称矩阵 一个简单的小把戏
  • 原文地址:https://www.cnblogs.com/ppzhang/p/15409642.html
Copyright © 2011-2022 走看看