跳转至

理解阻塞非阻塞和异步操作

了解任务执行的不同方法对于建模和构思可扩展的解决方案极为重要。 了解何时使用异步阻塞非阻塞操作可以对系统的响应时间产生巨大的影响。

理解阻塞操作

在阻塞操作的情况下,我们用在银行柜台接待客户的情境来举例子。 当呼叫特定客户的号码时,收银员的所有注意力都集中在这个特定的客户身上。 在满足当前特定客户的需求之前,收银员不能同时接待另一个客户。 现在,考虑到这一点,想象一家只有两名收银员的银行机构,当每小时有 100 名顾客涌入时; 然后我们就会面临一个处理流程的问题。 这个例子说明了处理的阻塞操作,当一个任务需要等待另一个任务结束时,阻塞了其对资源的访问。

在处理阻塞操作时,请求者阻塞结果直到它的请求被完成。

理解非阻塞操作

一般情况下很容易将非阻塞操作与异步操作混淆; 但是,它们是不同的概念,但他们却可以很好地协同工作,并且经常以这种方式使用。 让我们再用一个现实世界的情境来说明这种情况。 回到银行情境中,想象一下,在等待服务的客户中,有一个客户X需要提取一笔收益,但是暂时没有收益。 同时收银员不会拒绝对其他客户的服务,直到可以提取收益为止,而只是向客户 X 发出信号,让他在另一个时间或另一个日期再来。

非阻塞操作是这样一种操作,它在出现最小阻塞信号时返回一个控制代码异常,告诉请求者稍后重试。

理解异步操作

回到银行机构的例子,设想每个出职员有10个助手来执行需要较长时间的任务;现在考虑我们的机构有两个职员,每个人有10个助手。随着客户的到来,如果客户X有一个可能无限期阻塞队列的请求,这个请求就会被派给一个助理,这个助理会在后台做这个工作,当客户X的答案准备好了,就会直接找他,这样职员就可以腾出手来处理后面客户的请求,而不必阻塞前面的客户的需求了。

异步操作通过回调协程等机制通知请求结束。

回调函数是在特定条件发生时调用的函数。它通常用于处理异步执行的结果。


最后更新: 2023年2月27日
创建日期: 2015年6月25日