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

时间:2012-04-06 11:09:40

标签: 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
}

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

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

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

2 个答案:

答案 0 :(得分:5)

正如supertopi所说,你可以看看Child process。但我认为这会损害您的服务器的性能,如果这种情况顺序发生的话。然后我认为你应该排队他们。我认为你应该看一下asynchronous message queues来离线处理你的工作(分发)。消息队列的一些(仅举两个例子)示例是beanstalkdgearman

答案 1 :(得分:3)

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

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.
    });
}

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

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