node.js中的“产生线程”行为

我想添加一些pipe理实用程序到一个小的Web应用程序,如“备份数据库”。 用户将点击一个button,HTTP响应将立即返回,尽pipe潜在的长时间运行的进程已经在后台启动了。

在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的,所以节点应该以一种很好的asynchronous方式处理它。 我想我会做的是将doSomething转移到response.end之后,看看这是怎么回事。

我没有看到问题。 所有你需要做的就是doSomething()启动一个asynchronous操作。 它会立即返回,您的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. }); } 

在数据库连接build立之前, doSomething不会一直呆在那里,或者等待你告诉它备份。 它会马上返回,注册一个稍后运行的callback。 在幕后,你的数据库库可能会为你创build一些线程,使asynchronous工作的方式,但你的代码不需要担心, 您只需立即返回,立即将响应发送到客户端,asynchronous代码将保持asynchronous运行。

(实际上做更多的工作来同步运行 – 你必须把你的response对象传递给doSomething ,并且做一些response.end在最后的callback中调用,在备份完成之后。当然,那不是你想在这里做;你想立即返回,这正是你的代码将做的。)

supertopi说,你可以看看儿童进程 。 但是我认为这会损害你的服务器的性能,如果这种情况发生很多顺序。 那么我认为你应该排队他们。 我想你应该看看asynchronous消息队列来离线处理你的工作(分布式)。 一些(仅举两个例子)消息队列是beanstalkd , gearman 。