等待数据到来 这个 决定了 block / nonblock
进行数据拷贝 那这个呢?异步 IO 是数据已经拷贝完成的吧?
nodejs 应该是等数据已经拷贝完成 才调用用户的事件处理函数的吧?
1
wly19960911 2019-11-19 09:42:39 +08:00
阻塞和非阻塞指的是 work thread,如果是异步阻塞的话,需要更多的 work thread 带来的开销更大,而异步非阻塞能使用少量的 work thread 来排队,而 io 线程交给线程池处理,减少开更多线程的切换开销,适合 IO 密集型而非 计算密集型。
|
2
wly19960911 2019-11-19 09:43:21 +08:00
@wly19960911 记错单词, 是 worker thread ,工作线程。
|
3
ruandao OP @wly19960911 异步阻塞 要怎么弄? 按下面的描述的话,异步,不存在阻塞的?
同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用户线程发起 IO 请求后需要等待或者轮询内核 IO 操作完成后才能继续执行;而异步是指用户线程发起 IO 请求后仍继续执行,当内核 IO 操作完成后会通知用户线程,或者调用用户线程注册的回调函数。 |
4
wly19960911 2019-11-19 16:10:23 +08:00
@ruandao 我可能解释错误了,不好意思,阻塞和非阻塞是相对的,同步代码下面你还是会被阻塞,多线程的某个线程你仍然也会被阻塞,但是多线程仍然是异步。而阻塞和非阻塞是因为非阻塞采用了事件队列进行轮询 / event loop,这种非阻塞式 IO 的模型实现的,将事件拆成回调的形式,等辅助用的 IO 线程结束后,才将回调加入队列里面等待执行,最大程度的减少阻塞和线程切换开销。
另外你可以认为 worker thread 就是用户线程,通过队列机制,采用回调机制来安排 worker thread 减少开销。再上面的 协程 就是利用回调链,包装一次回调函数,让回调不用写在回调函数里面而是写成链式或者同步的样子( async await )。 |
5
wly19960911 2019-11-19 16:12:45 +08:00
”同步和异步是相对的,同步代码下面你还是会被阻塞“ => "阻塞和非阻塞是相对的,同步代码下面你会被阻塞"
|
6
wly19960911 2019-11-19 16:13:39 +08:00
状态不好,老打错字,忽略下五楼
”阻塞和非阻塞是相对的,同步代码下面你还是会被阻塞“ => "同步和异步是相对的,同步代码下面你会被阻塞" |
7
Raymon111111 2019-11-19 16:17:37 +08:00
可以多搜搜, 阻塞 /非阻塞 和 同步 /异步 完全不是一回事, 也不是一个维度的东西.
比如: First Let's talk about IO. When we have slow IO this is most apparent, but IO operations can either be blocking or non-blocking. This has nothing to do with threads, it has to do with the interface to the operating system. When I ask the OS for an IO operation I have the choice of waiting for all the data to be ready (blocking), or getting what is available right now and moving on (non-blocking). |
8
houzhimeng 2019-11-19 16:28:41 +08:00
|