异步/同步,阻塞/非阻塞,单线程/多线程概念梳理

最近看了一文说到异步是单线程的,顿时就傻眼了,对相关概念和同事进行了一些讨论和总结.
文中的描述是以我的理解来说的,可能不一定准确甚至正确,有错欢迎指正.

这三个概念我认为是描述不同的维度的,概念正交.

异步 同步

异步和同步是不同的流程设计风格.
但存在依赖关系的操作之间是同步的,也就是如果操作B依赖操作A的返回,那么B必须要在A结束后才能执行.
比如你要读取文件然后对文件内容进行处理,那么读取内容和处理内容就是同步的.

而异步这是操作间没有依赖关系,或者先后顺序并不重要.
比如用户登陆要给登陆奖励,在确认用户可登陆后之后的登陆流程和发放奖励间并无依赖关系,那么他们就可以异步执行.

这个概念主要描述依赖关系和流程设计.

阻塞 非阻塞

这个概念是描述操作是否会立即返回的.
这个概念常常和异步/同步混在一起.
同步就一定是阻塞的吗,这不一定,这取决于同步执行里的各个操作是否是阻塞的.

非阻塞操作可以被用在异步API的实现.
基于单线程的异步API实现里的操作一般都会要求为非阻塞.

单线程 多线程

这两个概念常和异步 同步混在一起.
比如认为异步一定是要多线程才能实现的,但其实不然,有很多基于Eventloop的单线程实现.
单线程 多线程主要描述的是运行的环境.
如图:

(来源参考3)

一些实现中相关的概念

在实现中,为了高效的执行这些概念会被组合起来使用.
单线程的异步操作,需要依赖非阻塞操作(不然单个线程就直接阻塞了).而这里异步的目的是为了提高线程的利用率,这在IO密集的应用中比较有效.
但如果操作本身是计算密集的,那么单线程的异步操作就没有太大的意义了.

而如果无法满足操作都是非阻塞的,那常常会使用多线程来规避主线程(例如服务器中的请求处理线程和GUI中的UI线程)阻塞.
这种一般会返回Future等类似的占位符,并提供非阻塞查询结果是否返回,或者支持回调函数.
这在java中比较常见,毕竟java世界中的阻塞操作比较多.

上述概念和IO的关系.
一些对应的API.

要记住的是这些操作和单线程/多线程都没什么关系.
更多的内容之前有翻译一篇文章: 各个类型的IO - 阻塞, 非阻塞,多路复用和异步
对应语言的各种IO要看使用了系统提供的哪些类型的API.
例如Java,在Linux中的AIO是多线程模拟实现的,而在windows下使用了IOCP使用.

参考资料:
1.https://blog.slaks.net/2014-12-23/parallelism-async-threading-explained/

2.https://stackoverflow.com/questions/41770985/i-o-blocking-in-green-threads

3.https://stackoverflow.com/questions/748175/asynchronous-vs-synchronous-execution-what-does-it-really-mean

原文地址:https://www.cnblogs.com/fairjm/p/sync-async_blocking_multithre.html

时间: 2024-08-11 01:57:06

异步/同步,阻塞/非阻塞,单线程/多线程概念梳理的相关文章

单线程,同步异步,阻塞非阻塞的理解

一.概念理解 1.同步异步: 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回.但是一旦调用返回,就得到返回值了.换句话说,就是由*调用者*主动等待这个*调用*的结果. 而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果.换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果.而是在*调用*发出后,*被

同步 异步 阻塞 非阻塞概念区分

老张爱喝茶,废话不说,煮开水. 提前剧透一下:同步和非同步主要用来形容被调用线程,阻塞非阻塞用来形容主线程的.出场人物:老张(主线程),水壶(被调用线程)两把(普通水壶,简称水壶:会响的水壶,简称响水壶). 1 老张把水壶放到火上,立等水开.(主线程等着,不断轮询被调用线程,直到被调用线程返回结果)(同步阻塞)老张觉得自己有点傻2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有.(主线程去做其他事了,但是还会时不时的查看被调用线程是否会返回结果,也就是说被调用线程自己是没法告诉主线程

[概念] 同步 异步 阻塞 非阻塞

同步 异步 指两个线程间的关系 两个线程之间要么是同步的,要么是异步的 同步操作时,调用者需要等待被调用者返回结果,才会进行下一步操作 异步操作时,调用者不需要等待被调用者返回调用,即可进行下一步操作 被调用者通常依靠事件.回调等机制来通知调用者结果 阻塞 非阻塞 是对同一个线程来说的 在某个时刻,线程要么处于阻塞状态,要么处于非阻塞状态 关注的是程序在等待调用结果(消息,返回值)时的状态 阻塞调用是指调用结果返回之前,当前线程会被挂起.调用线程只有在得到结果之后才会返回 非阻塞调用指在不能立刻

(转)同步异步/阻塞非阻塞 和 5种linux网络通信模型

会阻塞的函数:connect, accept,send/recv/sendto/recvfrom等读写函数. 不会阻塞的函数:bind, listen,socket, closesocket. linux网络通信模型有: 阻塞IO模型(同步),非阻塞IO模型(拷贝同步),IO复用模型(多线程同步),信号驱动IO模型((拷贝同步),异步IO模型(异步). node.js对同步/异步,阻塞非阻塞的解释: 线程在执行中如果遇到磁盘读写或网络通信(统称为I/O 操作),通常要耗费较长的时间,这时 操作系

[Z] linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO

原文链接:http://blog.csdn.net/colzer/article/details/8169075 IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file descriptor(fd,文件描述符).而对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符).描述符就是一个数字,指向内核中一个结构体(文件路径,数据

linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)

IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file descriptor(fd,文件描述符).而对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符).描述符就是一个数字,指向内核中一个结构体(文件路径,数据区,等一些属性).那么我们的应用程序对文件的读写就通过对描述符的读写完成. linux将内存分为内核区,用户区.l

Python番外之 阻塞非阻塞,同步与异步,i/o模型

1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对.当c端一个异步过程调用发出后,调

30分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行

基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程.线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码.进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域的.进程可以理解为一个程序的基本边界.是

同步/异步与阻塞/非阻塞

一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等).但是一般而言,我们在说同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务.最常见的例子就是 SendMessage.该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回.当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者. B.