Socket调用方式(同步,异步,阻塞,非阻塞)
同步:
我调用一个功能,该功能没有结束前,我死等结果。
异步:
当一个异步过程调用发出后,调用者不能立刻得到结果。该功能在完成后,通过状态、通知和回调来通知调用者。
同步和非同步关注的是调用者是否等待等待调用结果。
举个通俗的例子:
你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。
阻塞:
调用我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。
非阻塞:
调用我(函数),我(函数)立即返回通知调用者
以最常用的send和recv两个函数为例
比如你调用send函数发送一定的Byte,在系统内部send做的工作其实只是把数据传输(Copy)到TCP/IP协议栈的输出缓冲区,它执行成功并不代表数据已经成功的发送出去了,如果TCP/IP协议栈没有足够的可用缓冲区来保存你Copy过来的数据的话...这时候就体现出阻塞和非阻塞的不同之处了:对于阻塞模式的socket send函数将不返回直到系统缓冲区有足够的空间把你要发送的数据Copy过去以后才返回,而对于非阻塞的socket来说send会立即返回WSAEWOULDDBLOCK告诉调用者说:"发送操作被阻塞了!!!你想办法处理吧..." 
对于recv函数,同样道理,对于阻塞模式的socket来说如果TCP/IP协议栈的接收缓冲区没有通知一个结果给它它就一直不返回:耗费着系统资源....对于非阻塞模式的socket该函数会马上返回,然后告诉你:WSAEWOULDDBLOCK---"现在没有数据,回头再来看看"
阻塞I/O模型:

非阻塞I/O模型:

阻塞和非阻塞关注的是调用者在等待调用结果时的状态。
还是上面的例子,
你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。
同步异步与阻塞非阻塞的关系:
- 在处理 IO 的时候,阻塞和非阻塞都是同步 IO。socket接收数据的recv函数,如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止(同步&阻塞);CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回,而此时,当前线程还会继续处理各种各样的消息(同步&非阻塞)。
 - 只有使用了特殊的 API 才是异步 IO。
 

异步调用的方式:

function lightUp(A, callback){ 
 callback(); 
 A.lightUp(); 
} 
function callback(){
 B.lightUp(); 
}


var temp = false; 
while(!temp){
  temp = wait(A.lightUp());
}
B.lightUp();


function AlightUp(){ 
 this.trigger('done'); 
 this.do(); 
} 
function BlightUp(){ 
 this.do(); 
}
AlightUp.on('done',BlightUp);


jQuery.subscribe("done", f2);
function f1(){
  setTimeout(function () {
    // f1的任务代码
    jQuery.publish("done");
  }, 1000);
}  

jQuery.unsubscribe("done", f2); 

f1().then(f2);
function f1(){
var dfd = $.Deferred();
setTimeout(function () {
// f1的任务代码
dfd.resolve();
}, 500);
return dfd.promise;
}

Socket调用方式(同步,异步,阻塞,非阻塞)的更多相关文章
- 阻塞非阻塞,同步异步四种I/O方式
		
举一个去书店买书的例子吧: (同步)阻塞: 你去书店买书,到柜台告诉店员,需要买一本APUE,然后一直在柜台等.(阻塞) 店员拿到书以后交给你. (同步)非阻塞: 你去书店买书,到柜台告诉店员A,需要 ...
 - 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor
		
开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...
 - 高性能IO设计模式之阻塞/非阻塞,同步/异步解析
		
提到高性能,我想大家都喜欢这个,今天我们就主要来弄明白在高性能的I/O设计中的几个关键概念,做任何事最重要的第一步就是要把概念弄的清晰无误不是么?在这里就是:阻塞,非阻塞,同步,异步. OK, 现在来 ...
 - Python番外之 阻塞非阻塞,同步与异步,i/o模型
		
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: 所谓同步,就 ...
 - 008. 阻塞&非阻塞、同步&异步
		
阻塞 非阻塞:关注的对象是调用者: 阻塞:调用者发起调用后,处于等待状态,直到该调用有返回: 非阻塞:调用者发起调用后,不需要等待返回,可以往下执行: 同步 异步: 关注的对象是被调用者: 同步:服 ...
 - Python并发编程之同步\异步and阻塞\非阻塞
		
一.什么是进程 进程: 正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 进程和程序的区别: 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程. 需要强调的是:同一个程序执行两次,那也 ...
 - {Python之进程}    背景知识    什么是进程     进程调度     并发与并行      同步\异步\阻塞\非阻塞     进程的创建与结束     multiprocess模块     进程池和mutiprocess.Poll
		
Python之进程 进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mut ...
 - linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)
		
IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...
 - (转)同步异步,阻塞非阻塞 和nginx的IO模型
		
同步异步,阻塞非阻塞 和nginx的IO模型 原文:https://www.cnblogs.com/wxl-dede/p/5134636.html 同步与异步 同步和异步关注的是消息通信机制 (sy ...
 
随机推荐
- fiddler手机端抓包配置
			
首先,你得安装fiddler,这是前提条件,手机抓包有必须条件: 需要保持电脑和手机在同一个局域网中 (这一点,我一般会在电脑上启动一个wifi,然后手机连接即可) 下面说一下如何配置: 手机连接电脑 ...
 - redis安装全过程
			
1. 从官网上下载redis. 2.安装gcc 3.进入./redis/src目录下make MALLOC =libc 4.遇到的问题 Redis简介: Redis是一个开源的使用ANSI C语言编写 ...
 - java中读取配置文件
			
若是Javaweb项目,项目运行于tomcat或其他容器时,可以使用下面方式来获取文件的输入流 1.当属性文件放在src下面时 InputStream is = Thread.currentThrea ...
 - cratedb 基本试用
			
安装 docker run -d -p 4200:4200 crate UI访问 http://localhost:4200/#!/ 创建数据 tweets 是默认导入的,点击帮助导航可以操作 登陆 ...
 - timescaledb 几个方便的api
			
timescaledb 提供了内置的api 操作,方便我们进行操作控制 hypertable 控制api add_dimension 向hypertable添加一个额外的分片方式,可以做为分片列有时间 ...
 - 自动化工具 Python 调 Jmeter 执行参数化 jmx 脚本
			
烦透了jmeter输入如下鬼命令: Jmeter -n -t {tmpjmxfile} -l {csvfilename} -e -o {htmlreportpath} 尤其是{htmlreportpa ...
 - 容器平台选型的十大模式:Docker、DC/OS、K8S谁与当先?
			
首先我们来谈什么情况下应该使用Docker的问题 如图,左面是经常挂在嘴边的所谓容器的优势,但是虚拟机都能一一怼回去. 如果部署的是一个传统的应用,这个应用启动速度慢,进程数量少,基本不更新,那么 ...
 - centos下memcached安装
			
memcached是一款高速.分布式的内存缓存系统.其官方主页在http://www.danga.com/memcached/ 1.安装前的准备 要安装memcached,需要有libevent的支持 ...
 - debian下为apache启用rewrite模块
			
如果我们是自己编译的apache,那么启用或禁用某个模块应该说是比较容易的事,只要修改apache的配置文件就可以了.但是我们没有理由不用已经做好的二进制文件进行安装,使用apt-get要方便多了. ...
 - thinkphp配置rewrite模式访问时不生效 出现No input file specified解决方法
			
使用thinkphp配置rewire模式的路径访问网站时, 直接复制官网的.htaccess文件的代码复制过去 1 2 3 4 5 6 <IfModule mod_rewrite.c> ...