作家
登录

理解Python asyncio内部实现机制

作者: 来源: 2017-09-05 08:58:59 阅读 我要评论

 result 
  •  result = some_calculation(result3) 
  •  return api3(result2, api3_callback) 
  •  return api2(result1, api2_callback) 
  • api1(api1_callback) 
  • 这里 api1 api2 的实现因为须要用 event loop 来注册刊出某些事宜,所以显得特别复杂,这里我们可以先忽视它们的实现,然则看最后一段“用户代码”是不是极其复杂?跟着操作的复杂性增长,回调函数的嵌套会越变越深。如不雅你熟悉Javascript,你应当听过“callback hell”的大年夜名。回调函数的方法为什么不好?最重要的就是它违背了我们写代码的直觉,我们都习惯次序履行的代码。

    例如上例中,我们等待的是 api1 先履行,我们再用它的结不雅做点什么,但采取回调的方法,我们就须要在写 api1 的回调时,就去思虑我们想用它的结不雅做些什么操作。在这个例子里,我们须要调用 api2 及 api3 ,这些嵌套的思虑又得一遍遍反复下去。最终代码异常难以懂得。

    1. class Promise(): 
    2.  def __init__(self): 
    3.  pass 
    4.  def then(self, callback_that_return_promise): 
    5.  self._then = callback_that_return_promise 
    6.  def set_result(self, result): 
    7.  return self._then(result) 
    8.  
    9. # Implementation for api 
    10. def api1(): 
    11.  promise = Promise() 
    12.  def callback_for_api1(): 
    13.  promise.set_result(some_calculation_1()) 
    14.  event_loop.unregister_event(event1) 
    15.  event_loop.register_event(event1, callback_for_api1) 
    16.  return promise 
    17.  
    18. def api2(result): 
    19.  promise = Promise() 
    20.  def callback_for_api2(): 
    21.  promise.set_result((some_calculation_2(result)) 
    22.  event_loop.unregister_event(event2) 
    23.  return callback(result2) 
    24.  return promise 
    25. ... 
    26.  
    27. # Our code 
    28. global result 
    29. promise = api1().then(lambda result1: return api2(result1)) 
    30.  .then(lambda result2: return api3(result3)) 
    31.  .then(lambda result3: global result; result = result3) 
    32.  
    33. promise.wait_till_complete() 

    然而故事还没有停止,人们依旧不满于 Promise 的写法和用法,又提出了 async/await 的写法。在 Python 中,膳绫擎的代码用 async/await 重写如下:

    这里我们简单实现了一个我们本身的 Promise 类,当它的 set_result 办法被调用时,Promise 会去履行之前用 .then 注册的回调函数,该回调函数将履行另一些操作并返回一个新的 Promise。也是以,我们可以赓续地调用 then 将不合的 Promise 组合起来。可以看到,如今我们的代码就是线性的了!

    前面提到过,如不雅某个协程在等待某些资本,我们须要暂停它的履行,在 event loop 中注册这个事宜,以便当事宜产生的时刻,能再次唤醒该协程的履行。

    1. result1 = await api1() 
    2. result2 = await api2(result1) 
    3. result3 = await api3(result2) 

    是不是简单清楚明了?它的效不雅和我们前几个例子是等价的,但它的写法与我们初开端的壅塞版本几乎一致。如许能把异步与同步的编码在构造上尽量同一路来。


      推荐阅读

      Android必知必会-使用Intent打开第三方应用及验证可用性

    基本常识此方法多用于启动体系中的功能性应用,比如打德律风、发邮件、预览图片、应用默认浏览器打开一个网页等。1. App 的人口 Activity 与其 icon一个通俗的应用默认会有一小我口 Activ>>>详细阅读


    本文标题:理解Python asyncio内部实现机制

    地址:http://www.17bianji.com/lsqh/37131.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)