首页 > 技术文章 > socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别?

laifu 2014-03-29 20:37 原文

一、举个打电话的例子: 

  阻塞   block   是指,你拨通某人的电话,但是此人不在,于是你拿着电话等他回来,其间不能再用电话。同步大概和阻塞差不多。 

  非阻塞   nonblock   是指,你拨通某人的电话,但是此人不在,于是你挂断电话,待会儿再打。至于到时候他回来没有,只有打了电话才知道。即所谓的“轮询   /   poll”。 

  异步是指,你拨通某人的电话,但是此人不在,于是你叫接电话的人告诉那人(leave   a   message),回来后给你打电话(call   back)。 

二、同步异步与阻塞和非阻塞是两种不同的概念来着 

  同步异步指的是通信模式,而阻塞和非阻塞指的是在接收和发送时是否等待动作完成才返回 

  首先是通信的同步,主要是指客户端在发送请求后,必须得在服务端有回应后才发送下一个请求。所以这个时候的所有请求将会在服务端得到同步 

  其次是通信的异步,指客户端在发送请求后,不必等待服务端的回应就可以发送下一个请求,这样对于所有的请求动作来说将会在服务端得到异步,这条请求的链路就象是一个请求队列,所有的动作在这里不会得到同步的。 

    阻塞和非阻塞只是应用在请求的读取和发送。 

在实现过程中,如果服务端是异步的话,客户端也是异步的话,通信效率会很高,但如果服务端在请求的返回时也是返回给请求的链路时,客户端是可以同步的,这种情况下,服务端是兼容同步和异步的。相反,如果客户端是异步而服务端是同步的也不会有问题,只是处理效率低了些。

参考文档:http://blog.csdn.net/hguisu/article/details/7453390

http://www.cnblogs.com/zhangchaoyang/articles/2617188.html

推荐阅读