美文网首页我爱编程
Tornado #2 异步并发(协程)实现

Tornado #2 异步并发(协程)实现

作者: 平仄_pingze | 来源:发表于2018-06-11 10:17 被阅读39次

    Tornado本身提供了异步并发(协程)实现。

    使用Python异步编程时,我们有多种选择。比如callback、Promise、Future……

    基本

    这里提供一种最佳实践(Python3.5及以上):

    from tornado.ioloop import IOLoop
    from tornado.httpclient import AsyncHTTPClient
    
    async def fetch_coroutine(url):
        '协程获取网络资源'
        http_client = AsyncHTTPClient()
        response = await http_client.fetch(url)
        print('response', response)
    
    IOLoop.current().run_sync(lambda: fetch_coroutine('http://www.baidu.com'))
    

    可以看到,异步函数语法近似node的async-await语法。但是异步函数不能直接调用,必须用IOLoop.current().run_sync(<function>)来执行(这一点类似于node的co函数)。注意,这个函数的执行是同步的,执行时阻塞后面代码。

    另外,想要正确异步执行操作,关键函数必须本身是异步的。比如上面的http_client.fetch()。使用urllib的同步方法获取是不能真正实现异步并发的。
    python有些库可以支持异步IO,比如motor是一个异步的Mongodb driver。
    一些同步函数的异步版本可以在tornado.sleep()中找到。比如time.sleep()的异步版本:tornado.gen.sleep()。

    相关文章

      网友评论

        本文标题:Tornado #2 异步并发(协程)实现

        本文链接:https://www.haomeiwen.com/subject/anaasftx.html