I/O 回调中安排的 setImmediate() 函数是否可以重新计算其他 I/O 通知的超时?
Can a setImmediate() function scheduled in an I/O callback recalculate timeout for other I/O notifications?
Node js 事件循环的 poll
阶段。它的目的是阻塞地等待 I/O 通知,然后执行所需的回调。进入该阶段前计算等待超时时间。如果有通过 setImmediate
安排的操作,则超时设置为 0,如果发生计时器,则超时设置为考虑到它们,如果没有此类障碍,则阻塞将“永远”继续。
如果超时最初设置为“无穷大”并且 I/O 回调计划使用 setImmediate
或 setInterval
的函数,会发生什么情况?是立即重新计算超时还是仅在 I/O 队列变空后(在下一个循环迭代中)重新计算?
因此,如果我们等待两个启动的带有回调 A
和 B
的异步操作,并在收到 I/O 通知后执行 A
并依次安排一些C
函数与 setImmediate
函数首先执行什么 B
或 C
?
请注意,对于一些更常见的异步 API 定时器支持(例如 select()
或 kqueue()
系统调用)定时器值为零(0
) 表示 infinity 的值,因此您不能通过计算下一个超时值并调用异步 API。相反,所有 setImmediate()
或 nextTick()
回调 必须 在调用异步 API.
之前被同步调用
因此,由于 C
是对 setImmediate()
的回调,它将在我们重新进入事件循环以等待 B
触发之前被调用。
因此,如果 A
和 只有 a 被触发,那么函数调用的顺序将是:A
和 C
。
但如果 A
和 B
同时发生,函数调用的顺序将是:A
、B
、C
.
请注意,我说的是 A
和 C
而不是 A
、C
、B
,因为我们没有说 B
被触发。据我所知,B
只会在 8 个月后触发,甚至永远不会触发。
但是如果 A
被触发并且 1 毫秒后 B
发生,那么函数调用的顺序将是:A
、C
、B
是否有可能在同一个事件循环中发生两个事件?一般是的。如果是网络 I/O 则不太可能,因为 IP 数据包是序列化的,但它仍然可能发生,尤其是当您的机器有多个网卡时。如果它是像 DOM 更新这样的图形事件,那么在同一个事件循环中发生两件事是很常见的,例如:页面调整大小和内容重排可以同时发生,尤其是响应式 CSS 使用媒体查询时页面调整大小可以触发内容重排。
Node js 事件循环的 poll
阶段。它的目的是阻塞地等待 I/O 通知,然后执行所需的回调。进入该阶段前计算等待超时时间。如果有通过 setImmediate
安排的操作,则超时设置为 0,如果发生计时器,则超时设置为考虑到它们,如果没有此类障碍,则阻塞将“永远”继续。
如果超时最初设置为“无穷大”并且 I/O 回调计划使用 setImmediate
或 setInterval
的函数,会发生什么情况?是立即重新计算超时还是仅在 I/O 队列变空后(在下一个循环迭代中)重新计算?
因此,如果我们等待两个启动的带有回调 A
和 B
的异步操作,并在收到 I/O 通知后执行 A
并依次安排一些C
函数与 setImmediate
函数首先执行什么 B
或 C
?
请注意,对于一些更常见的异步 API 定时器支持(例如 select()
或 kqueue()
系统调用)定时器值为零(0
) 表示 infinity 的值,因此您不能通过计算下一个超时值并调用异步 API。相反,所有 setImmediate()
或 nextTick()
回调 必须 在调用异步 API.
因此,由于 C
是对 setImmediate()
的回调,它将在我们重新进入事件循环以等待 B
触发之前被调用。
因此,如果 A
和 只有 a 被触发,那么函数调用的顺序将是:A
和 C
。
但如果 A
和 B
同时发生,函数调用的顺序将是:A
、B
、C
.
请注意,我说的是 A
和 C
而不是 A
、C
、B
,因为我们没有说 B
被触发。据我所知,B
只会在 8 个月后触发,甚至永远不会触发。
但是如果 A
被触发并且 1 毫秒后 B
发生,那么函数调用的顺序将是:A
、C
、B
是否有可能在同一个事件循环中发生两个事件?一般是的。如果是网络 I/O 则不太可能,因为 IP 数据包是序列化的,但它仍然可能发生,尤其是当您的机器有多个网卡时。如果它是像 DOM 更新这样的图形事件,那么在同一个事件循环中发生两件事是很常见的,例如:页面调整大小和内容重排可以同时发生,尤其是响应式 CSS 使用媒体查询时页面调整大小可以触发内容重排。