2012-04-06 52 views
5

我想添加一些管理实用程序到一个小的Web应用程序,如“备份数据库”。用户将点击一个按钮,HTTP响应将立即返回,尽管可能长时间运行的进程已在后台启动。node.js中的“产生线程”式行为

在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()在后台运行。

好吧,给定节点的单线程模型,如果不产生另一个OS级别的ChildProcess,看起来不可能。我的误解。

在我的代码中,我需要的备份大多是基于I/O的,所以节点应该以很好的异步方式处理它。我想我会做的是将doSomething转移到response.end之后,看看它是如何表现的。

+0

我相信你浏览过文档。 http://nodejs.org/docs/v0.4.7/api/index.html我认为这取决于你的过程的性质,但看看儿童进程。 – supertopi 2012-04-06 11:36:57

+0

谢谢。看起来我的问题根源在于对node如何工作的深刻误解:) Child Process是我的想法,虽然不是最简单的解决方案,请参阅下面的Joe的回复。 – danja 2015-08-14 18:05:17

回答

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

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

(它实际上更多的工作,以使这个同步运行 - 你有你的response对象传递到doSomething,并有doSomething做最里面的回调里面response.end呼叫时,备份完成后,当然,这不是你想在这里做什么;你想立即返回,这正是你的代码将做的。)

+0

谢谢。看来我的问题根源在于对节点如何工作的深刻误解:) – danja 2015-08-14 18:02:34

5

supertopi说你可以看看Child process。但是我认为这会损害服务器的性能,如果这种情况连续发生的话。那么我认为你应该排队他们。我想你应该看看asynchronous message queues离线处理你的工作(分布式)。消息队列的一些(仅举两个例子)是beanstalkdgearman

+0

谢谢。看起来我的问题源于对节点如何工作的深刻误解:)虽然使用队列似乎是一个非常好的主意。 – danja 2015-08-14 18:02:11