在node.js中"生成类似线程"的​​行为

dan*_*nja 5 multithreading node.js

我想在一些小型Web应用程序中添加一些管理实用程序,例如"备份数据库".用户将单击一个按钮,HTTP响应将立即返回,尽管可能长时间运行的进程已在后台启动.

在Java中,这可能是通过使用Actor在Scala中生成一个独立的线程来实现的.但是node.js中有什么合适的习惯用法?(代码片段赞赏)

我现在正在重新阅读这些文档,这确实看起来似乎是一个节点101问题,但这几乎就是我在这方面...无论如何,澄清这是基本场景:

function onRequest(request, response) {
    doSomething();
    response.writeHead(202, headers);
    response.end("doing something");
}

function doSomething(){
     // long-running operation
}
Run Code Online (Sandbox Code Playgroud)

我希望响应立即返回,让doSomething()在后台运行.

好吧,鉴于节点的单线程模型似乎不可能产生另一个操作系统级别的ChildProcess.我的误会.

在我的代码中,我需要的备份主要是基于I/O,因此节点应该以一种漂亮的异步方式处理它.我认为我会做的是将doSomething转移到response.end之后,看看它是如何表现的.

Alf*_*red 5

正如supertopi所说,你可以看看Child过程.但我认为这会损害您的服务器的性能,如果这种情况顺序发生的话.然后我认为你应该排队他们.我认为您应该查看异步消息队列以脱机处理您的作业(分布式).一些(仅举两个)消息队列的例子是beanstalkd,gearman.


Joe*_*ite 3

我没有看到问题所在。您所需要做的就是doSomething()启动异步操作。它会立即返回,您onRequest将写回响应,客户端将收到“好的,我开始”消息。

function doSomething() {
    openDatabaseConnection(connectionString, function(conn) {
        // This is called some time later, once the connection is established.
        // Now you can tell the database to back itself up.
    });
}
Run Code Online (Sandbox Code Playgroud)

doSomething不会只是坐在那里直到建立数据库连接,或者等待您告诉它备份。它会立即返回,并注册了稍后运行的回调。在幕后,您的数据库库可能会为您创建一些线程,以使异步按其应有的方式工作,但您的代码不需要担心它;你只需立即返回,立即将响应发送给客户端,异步代码就会继续异步运行。

(实际上,要使其同步运行,需要做更多的工作 - 您必须将response对象传递到doSomething,并在备份完成后在最里面的回调中进行调用。当然,这不是您想要在这里做的;doSomethingresponse.end想要立即返回,这正是您的代码要做的。)