但一个异步调用开始的时候 主线程产生了一个任务,并且订阅了这个任务的完成事件。然后把这个任务扔给工作线程去做,当工作线程执行完以后会触发这个任务的完成事件,通知主线程。然后主线程的下一个tick会检测到这个事件,然后调用这个任务的回调方法。我这个理解对不对? 也就是说事件的触发是在工作线程 事件的响应在主线程。 请赐教。
TL;DR
@captainblue2013 这是什么暗号
@captainblue2013 装完b就跑,真刺激 - -
@MiguelValentine top,left,down,right@MiguelValentine
来自酷炫的 CNodeMD
其实我,想弱弱问下,node不是单线程的吗?
来自酷炫的 CNodeMD
下面信息来自官方文档 http://nodejs.cn/doc/node/events.html#events_emitter_emit_eventname_arg1_arg2
emitter.emit(eventName[, arg1][, arg2][, …])
Synchronously calls each of the listeners registered for the event named eventName, in the order they were registered, passing the supplied arguments to each.
Returns true if the event had listeners, false otherwise. 也就是说,emit事件是同步的,即立刻执行; 当然也可以实现成Next Tick执行,通过调用process.nextTick(){ callback(param) }形式即可。
@IvanYoung-GitHub 多谢 那就是说事件的触发和响应都在主线程 工作线程处理完以后是通过某种消息机制通知主线程 然后主线程在next tick时检测到这个消息 然后emit
@zaaack 单线程的话那处理io的时候就阻塞了
@jdilt 我目前的理解是这样的,另外附图是《深入浅出Node.js》里面的相关截图,不谢!
@IvanYoung-GitHub 这个第一块和第三块是不是在同一个线程里 我的疑问是事件循环是不是也在主线程里 只不过每个tick都会检查一次
- 第一块和第三块是在同一个线程里面的,也就是主线程。(Javascript运行的唯一线程)
- 事件循环是运行在主线程里面的,一次事件循环就是一次Tick。
Node进程初始化后,就一直处于事件循环状态,直到进程退出为止。其中事件不仅仅只包括pending callbacks事件,还有timers事件,poll连接请求事件,setImmediate事件。
事件优先级为,每个事件都有队列进行缓存。
- timers
- pending callbacks
- poll连接请求事件
- setImmediate事件
@IvanYoung-GitHub 明白了 多谢兄台