资讯专栏INFORMATION COLUMN

【妙用协程】 - I/O阻塞和流程阻塞

xinhaip / 2650人阅读

摘要:所以我们这里谈的流程阻塞只是一种简化的流程建模的实现。在某种意义下,阻塞和流程阻塞都是阻塞问题。

咱不咬文嚼字地掰什么是Blocking I/O,什么是Async I/O,没啥意思。代码是用来解决问题的。有的时候透彻理解问题,会比透彻理解某个具体的解法更重要。
I/O阻塞的问题来源就是,当我们需要输入输出的时候,特别是通过网络传输数据的时候。从请求发出,到得到对方的应答确认是一段时间的。比如说代码中调用

sock.connect()

实际对应的TCP包有三个

client = syn =>      server
client <= syn+ack =  server
client = ack =>      server

这一来两去的不得好几百ms么?在这段时间内,执行I/O操作的程序其实是被阻塞住了不能去干别的事情的。如何让机器在等待I/O的时候同时干别的事情从而充分利用资源就是我们要解决的问题。
流程阻塞的问题与I/O阻塞的问题类似,比如

stop_server()
migrate_db_to_newer_version()
start_server()

我们有一个三步骤的流程,第一步把服务器停掉,可能要花1分钟,第二步升级数据库,可能要花30分钟,第三步在升级之后把服务器重新启动起来,可能需要30秒。这样的一个流程在执行的时候,对于执行者来说也是被阻塞了的。为了充分利用资源,同样希望执行上述脚本的机器能够在流程等待的时候同时去干点的事情。甚至如下面的流程

if is_approved_by_admin():
    stop_server()
    migrate_db_to_newer_version()
    start_server()

如果流程中需要人工审批,我们甚至希望执行该流程机器可以彻底把资源释放,把流程状态存到数据库里,等用户审批确认的时候再把流程继续执行。
当然除了能够在等待的时候更充分地利用资源之外,流程这个领域往往还有更高的要求。比如很多情况下我们希望能够在阻塞状态下,清楚地知道每个流程的当前状态,甚至是对状态进行一些人工干预。经典的工作流的需求有三种建模方法,一种是我们这里使用的串行process的方式,另外一种是FSM(有限状态机),另外一种是petri net。所以我们这里谈的流程阻塞只是一种简化的流程建模的实现。
在某种意义下,I/O阻塞和流程阻塞都是阻塞问题。对于编码实现去解决阻塞问题的码农来说,就是如何用代码告诉计算机如何处理阻塞:

在阻塞的时候同时去干点什么别的事情

阻塞前后的代码逻辑如何连贯起来

从实现的效果上来说两个评价标准

快不快:并发数,吞吐量,延迟

好不好懂:我认为阅读相关代码时候眼球移动距离可以用来度量Logic Locality。这个指标可以用来代表代码质量

在如何表达“阻塞如何处理”这个问题上,有太多经典模式了。比如多线程,selector,proactor,协程等。每种模式解决的问题是一样的,无非就是在快不快和好不好懂两个问题上做了不同的取舍而已。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45307.html

相关文章

  • 妙用协程】 - 可持久化的协程能被用来实现工作流

    摘要:常规版本的的是不可以被持久化保存的。在流程被阻塞的时候比如需要审批老板不在把协程持久化成入库,等流程不再阻塞的时候把协程重新从数据库里拉起来继续执行。 常规版本的Python的generator是不可以被持久化保存的。但是stackless和pypy这两个修改版本的Python解释器可以。下面这段代码演示了如何把一个执行中的函数持久化保存,然后过段时间再把函数从上次执行到的地方原样拉起...

    wpw 评论0 收藏0
  • Python中的并发处理之使用asyncio

    摘要:并发用于制定方案,用来解决可能但未必并行的问题。在协程中使用需要注意两点使用链接的多个协程最终必须由不是协程的调用方驱动,调用方显式或隐式在最外层委派生成器上调用函数或方法。对象可以取消取消后会在协程当前暂停的处抛出异常。 导语:本文章记录了本人在学习Python基础之控制流程篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、了解asyncio...

    tuniutech 评论0 收藏0
  • Tornado 4.3文档翻译: 用户指南-异步阻塞I/O

    摘要:译者说于年月日发布,该版本正式支持的关键字,并且用旧版本编译同样可以使用这两个关键字,这无疑是一种进步。其次,这是最后一个支持和的版本了,在后续的版本了会移除对它们的兼容。 译者说 Tornado 4.3于2015年11月6日发布,该版本正式支持Python3.5的async/await关键字,并且用旧版本CPython编译Tornado同样可以使用这两个关键字,这无疑是一种进步。其次...

    smartlion 评论0 收藏0

发表评论

0条评论

xinhaip

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<