您的位置:首页 > 其它

2 同步 异步 阻塞 非阻塞

2017-01-12 20:03 218 查看

一.进程同步及异步的概念

同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)

1.同步,就是在发出一个调用时,在没有得到结果之前,该调用不会返回。但是一旦调用返回,就得到返回值了。

换句话说,就是由调用者主动等待这个调用的结果

就像早上起床后,先洗涮,然后才能吃饭,不能在洗涮没有完成时,就开始吃饭.按照这个定义,其实绝大多数函数都是同步调用。是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。

2.异步

异步的概念和同步相对,调用在发出之后,这个调用就直接返回了,没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或者通过回调函数处理这个调用。

执行部件和调用者通过三种途径返回结果:状态、通知和回调。可以使用哪一种依赖于执行部件的实现,除非执行部件提供多种选择,否则不受调用者控制。如果执行部件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低。如果使用通知的方式,效率很高,因为执行部件几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别。

进程同步的基本概念

在计算机系统中,由于资源有限而导致了进程之间的资源竞争和共享,因此,进程的并发执行不仅仅是提高资源利用率的结果,也是资源有限性导致资源的竞争与共享对进程的执行过程进行制约所造成的。

二.同步,异步,阻塞

同步是阻塞模式,异步是非阻塞模式。

同步,调用函数后,不会立即返回,而是等到函数执行结束后才继续执行;

异步,调用函数后,立即返回,继续执行;

以Python中的多进程为例:

import multiprocessing
import time

def func(msg):
print "msg:%s,time = %s"%(msg,time.ctime())
time.sleep(1)

if __name__ == "__main__":
'''apply_async与apply区别'''
pool = multiprocessing.Pool(processes = 3)
t1 = time.time()
for i in xrange(4):
msg = "hello %d" %(i)
pool.apply_async(func, (msg, ))
pool.close()
pool.join()
t2 = time.time()
print u"异步执行时间",t2 - t1

pool = multiprocessing.Pool(processes = 3)
t1 = time.time()
for i in xrange(4):
msg = "hello %d" %(i)
pool.apply(func, (msg, ))
pool.close()
pool.join()
t2 = time.time()
print u"同步执行时间",t2 - t1




三.实例解释同步异步

事例1

举个例子:普通B/S模式(同步)AJAX技术(异步)

同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事

异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。

异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。

所以,要我请你吃饭就用同步的方法,要请我吃饭就用异步的方法,这样可以省钱。

事例2

你打电话问书店老板有没有《分布式系统》这本书,

同步通信机制,书店老板会说,你稍等,”我查一下”,然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。

异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。

阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。

非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。

转载请标明出处,原文地址(http://blog.csdn.net/lis_12/article/details/54381279).

如果觉得本文对您有帮助,请点击‘顶’支持一下,您的支持是我写作最大的动力,谢谢。

参考网址http://blog.chinaunix.net/uid-21411227-id-1826898.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息