Board logo

标题: Python并发之异步I/O(async,await)-1 [打印本页]

作者: look_w    时间: 2019-3-4 18:40     标题: Python并发之异步I/O(async,await)-1

Python并发之异步I/O(async,await)
背景

Python有很长一段的异步编程历史,特别是twisted,gevent和一些无堆栈的Python项目。
异步编程因为一些好的原因在这些年来越来越受关注。尽管相对于传统的线性风格更难一点,但是却是值得的:因为异步编程有更高的效率。
举个例子:在Http请求方面,Python异步协程可以提交请求然后去做队列中其他等待的任务,让它慢慢请求,而不是传统的一直等它请求到完成为止,这样的话会浪费更多的时间与资源。总之异步编程能让你的代码在处于等待资源状态时处理其他任务。
在Python3.4中,asyncio产生了。而在Python3.5中,有加入了对async def 和await新的语法支持,让我们看一看它们怎么工作的。
协程

在Python中,一个异步的函数我们通常叫它协程。之前我们在讲解yield的时候也已经讲过yield语法在协程中的基本使用了,这次同样是协程,但却是不同的语法。

    #在Python 3.4中, 创建一个协程我们用asyncio.coroutine装饰器:
    async def double(x):
        return x * 2
     
    # 这是个协程对象
    >>> double(6)
    >>><coroutine object double at 0x115b59d58>
     
    # 既然是协程,我们像之前yield协程那样,预激活一下(注意这里用next(double(6)预激活会报错)
    >>> double(6).send(None)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration: 12
    # 好像差不多。

或者是这样的:

    async def ping_server(ip):
        # ping code here...
     
    # 用await语法代替"yield from"
    async def ping_local():  
        return await ping_server('192.168.1.1')

建议使用Python3.5最新主流语法:async def ,await




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0