Socket学习系列之说说同步/异步&阻塞/非阻塞调用的区别

[TOC]

在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式,我们来整理下四种调用方式的差异。

同步/异步调用差异 

同步调用:

所谓同步,就是在调用端发出一个功能调用时,在没有得到结果之前调用端会一直等待,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。

例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事

异步调用:

异步的概念和同步相对。当调用端一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知或者回调来通知调用者。

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

阻塞/非阻塞调用差异

阻塞调用

阻塞调用是指调获得用结果返回之前,当前线程/线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。

有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。 

非阻塞调用

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回错误。
非阻塞中调用方可以暂时先去忙别的事情,间隔一段时间来尝试重新调用并尝试获取结果(调用后系统如果没有可读标识,内核会直接返回错误而不等待)

在 “Socket学习系列之说说同步/异步&阻塞/非阻塞调用的区别” 上有 2 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注