同步与异步 阻塞与非阻塞

同步与异步

转自:Python中关于同步异步、阻塞非阻塞的理解 - 简书

同步和异步关注的是消息通信机制.
同步异步指的是调用者与被调用者两者之间的关系,而不是经常容易误解的多个被调用者之间的关系。

同步

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回,一旦调用返回,就得到返回值了。
换句话说,就是由调用者主动等待这个调用结果.按照此定义,其实绝大多数函数都是同步调用。但是一般而言,我们在说同步、异步的时候,特指那些需要其他程序或者IO协作或者需要一定时间完成的任务。

举例:

 
  1. #1. multiprocessing.Pool下的apply #发起同步调用后,

  2. 就在原地等着任务结束,根本不考虑任务是在计算还是在io阻塞,总之就是一股脑地等任务结束

  3. #2. concurrent.futures.ProcessPoolExecutor().submit(func,).result()

  4. #3. concurrent.futures.ThreadPoolExecutor().submit(func,).result()

简单一句话就是:调用者调用了一个功能时调用者要等着被调用者执行完毕,无论被调用者是在阻塞还是非阻塞状态,才能继续进行自己的任务

异步

异步的概念和同步相对。调用在发出之后,这个调用就直接返回了,所以没有返回结果.换句话说当一个异步功能调用发出后,调用者不能立刻得到结果。但是这个时候被调用者可以去执行下面的代码而不是一味的等待。
另外需要强调的一点:
当该异步功能完成后,被调用者可以通过状态、通知或回调来通知调用者。如果异步功能用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一 种很严重的错误)。如果是使用通知的方式,效率则很高,因为异步功能几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别。

举例:

 
  1. #1. multiprocessing.Pool().apply_async() #发起异步调用后,

  2. 并不会等待任务结束才返回,相反,会立即获取一个临时结果(并不是最终的结果,

  3. 可能是封装好的一个对象)。

  4. #2. concurrent.futures.ProcessPoolExecutor(3).submit(func,)

  5. #3. concurrent.futures.ThreadPoolExecutor(3).submit(func,)


阻塞与非阻塞

阻塞

阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。调用线程只有在得到结果之后才会返回。函数只有在得到结果之后才会将阻塞的线程激活。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。

举例:

 
  1. 1. 同步调用:apply一个累计1亿次的任务,该调用会一直等待,直到任务返回结果为止,

  2. 但并未阻塞住(即便是被抢走cpu的执行权限,那也是处于就绪态);

  3. 2. 阻塞调用:当socket工作在阻塞模式的时候,如果没有数据的情况下调用recv函数,

  4. 则当前线程就会被挂起,直到有数据为止。

非阻塞

非阻塞和阻塞的概念相对应,非阻塞调用指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程。


总结

  1. 同步与异步针对的是函数/任务的调用方式:同步就是当一个进程发起一个函数(任务)调用的时候,一直等到函数(任务)完成,而进程继续处于激活(非阻塞)状态。而异步情况下是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行,当函数返回的时候通过状态、通知、事件等方式通知进程任务完成。
  2. 阻塞与非阻塞针对的是进程或线程:阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程

Python 同步 异步 阻塞 非阻塞 通俗解释

首先,同步 异步 阻塞 非阻塞 这些概念其实和语言无关。
但是很多小伙伴是在写python的时候遇到了这类问题。

网上也能搜到这些概念是什么,我就不废话了,直接上通俗解释:

用水壶烧水,并且站在煤气灶旁边,啥事不干,两眼直勾勾的盯着水壶,等水烧开。烧开后就去泡咖啡。同步阻塞

用水壶煮水,不过此时不再傻傻得站在那里看水开没开,而是去玩局LOL,每当自己死了,就过来看看水开了没有。如果水开了就去泡咖啡。同步非阻塞

用响壶烧水,仍然站在煤气灶旁边,不过此时不两眼直勾勾的盯着壶了,而是听响,因为响壶水开时会用响声通知小A。异步阻塞

在上述的基础上,不站在煤气灶旁边了,而是去玩局LOL,等听到响壶的声音提醒后,再去跑咖啡。异步非阻塞

从上述通俗解释也能看出来,其实同步、异步是一组概念;阻塞、非阻塞是一组概念。他们两组之间可以任意组合。

阻塞和非阻塞就是进程因为io请求一直在等待服务响应

同步阻塞、同步非阻塞IO模型 - 轻量级赤影的个人空间 - OSCHINA - 中文开源技术交流社区

你可能感兴趣的:(java,golang)