|
|
1
28
你的困惑可能是因为没有充分关注事件循环。很明显,你知道这是如何工作的,但也许你还不知道全部情况。 第1部分,事件循环基础
当你打电话给
然而,当请求进入时,因为我们处于与V8引擎不同的线程中(并且不能直接调用route函数),对函数的序列化调用会附加到 共享 事件循环,以便稍后调用。(“事件循环”在这个上下文中是一个糟糕的名称,因为它的操作更像队列或堆栈) 在JavaScript文件的末尾,V8引擎将检查事件循环中是否有任何正在运行的指令或消息。如果没有,它将以代码0退出(这就是服务器代码保持进程运行的原因)。所以首先要理解的是 在到达JavaScript文件的同步端之前,不会处理任何请求。 如果在进程启动时附加了事件循环,则事件循环上的每个函数调用都将同步地逐个处理。 为了简单起见,让我把你的例子分解成更具表现力的部分。
â
在本例中,输出将始终为:
两个对
将文件的执行视为 事件循环的第一件事 。由于事件循环的每次调用只能串联发生,因此在其执行过程中不会发生其他事件循环调用,这是一个逻辑结果; 只有在上一次调用完成后,才能调用下一个事件循环函数。 第2部分,内部回调同样的逻辑也适用于内部回调,并且可以用来解释为什么程序永远不会输出:
正如你所料。
在文件执行结束时,事件循环上将出现两个序列化函数调用,这两个函数都是
第一件事
此时,事件循环如下所示:
回归
现在
这样,事件循环就剩下了另外两个函数:
这两个函数都不会进一步扰乱事件循环。他们一个接一个地执行,第二个等待第一个返回。然后,当第二个循环返回时,事件循环保留为空。这个事实,再加上当前没有其他线程在运行,会触发进程结束,返回代码为0。 第3部分,与原始示例相关在您的示例中发生的第一件事是在进程中创建一个线程,该线程将创建一个绑定到特定端口的服务器。注意,这是在预编译的C++代码中发生的,不是JavaScript,不是一个单独的进程,它是同一进程内的线程。 见: C++ Thread Tutorial . 因此,无论何时,只要有请求进来,原始代码的执行就不会受到干扰。相反,传入的连接请求将被打开、保留并附加到事件循环中。
这个
所以,假设有两个请求进入服务器:T1和T2。在你的问题中,你说它们同时出现,因为这在技术上是不可能的,我假设它们是一个接一个的,它们之间的时间可以忽略不计。 无论哪一个请求先到达,都将首先由前面的第二个线程处理。一旦那个连接被打开,它就会被附加到事件循环中,我们继续下一个请求,然后重复。
在将第一个请求添加到事件循环后的任何时候,V8都可以开始执行
关于
|
|
|
2
5
对于每个传入的请求,节点将逐个处理。这意味着必须有秩序,就像排队一样,先到先得。当节点开始处理请求时,所有同步代码都将执行,异步代码将传递给工作线程,这样节点就可以开始处理下一个请求。异步部分完成后,它将返回主线程并继续运行。 所以,当同步代码花费的时间太长时,就会阻塞主线程,节点将无法处理其他请求,这很容易测试。
在完成所有同步部分之前,节点不会开始处理下一个请求。所以人们说不要阻挡主线。 |
|
|
3
3
有很多文章解释了这一点,比如 this one
长话短说就是
例如,在代码中,正在运行的应用程序的PID为1。当您收到请求T1时,它会创建处理该请求的PID 2(需要1分钟)。在运行过程中,您会收到请求T2,这会产生PID 3,也需要1分钟。PID 2和PID 3都将在任务完成后结束,但PID 1将在事件进入时继续监听和传递事件。
总之,
|
|
|
4
2
只需使用fork()在不同的文件中移动readImage()函数,即可创建子进程。
父文件,
子文件,
以上文章可能对你有用。
在上面的父文件中,我们使用fork
要将消息从父级传递给子级,我们可以执行
在执行
|
|
|
5
0
V8 JS interpeter(即节点)基本上是单线程的。但是,它启动的进程可以是异步的,例如:。读取文件'。 当express服务器运行时,它将根据需要打开新的进程来完成请求。因此,“readImage”函数将被启动(通常是异步的),这意味着它们将以任何顺序返回。但是,服务器将自动管理哪个响应发送到哪个请求。
所以你不必去管它
基本上,T1和T2不会同时返回,这几乎是不可能的。它们都严重依赖文件系统来完成“读取”,而且它们可能以任何顺序完成(这是无法预测的)。请注意,进程由操作系统层处理,本质上是多线程的(在现代计算机中)。 如果您正在寻找队列系统,那么实现/确保按照请求的确切顺序读取/返回图像应该不会太难。 |
|
|
6
-1
|
|
|
code-geek · Jquery根据单选按钮选择隐藏或显示文本字段 1 年前 |
|
|
Alex · 在轻量级中同时解构和不解构变量 1 年前 |
|
|
Ângelo Rigo · ReactJS映射:如何迭代[关闭] 1 年前 |
|
|
bairog · 从按属性筛选的对象数组字典中创建值数组 1 年前 |
|
|
lokiuucx · JS对象属性返回未定义,尽管对象属性应该有值 1 年前 |