Multithreading &引用;产生一个线程"-类似node.js中的行为
我想在一个小Web应用程序中添加一些管理实用程序,例如“备份数据库”。用户将单击按钮,HTTP响应将立即返回,尽管潜在的长时间运行过程已在后台启动 在Java中,这可能是通过生成一个独立线程来实现的,在Scala中是通过使用一个参与者来实现的。但是node.js中合适的习惯用法是什么?(欢迎使用代码片段) 我现在正在重新阅读文档,这看起来确实是一个node 101问题,但这正是我要讨论的问题……无论如何,澄清一下这是基本情况:Multithreading &引用;产生一个线程"-类似node.js中的行为,multithreading,node.js,Multithreading,Node.js,我想在一个小Web应用程序中添加一些管理实用程序,例如“备份数据库”。用户将单击按钮,HTTP响应将立即返回,尽管潜在的长时间运行过程已在后台启动 在Java中,这可能是通过生成一个独立线程来实现的,在Scala中是通过使用一个参与者来实现的。但是node.js中合适的习惯用法是什么?(欢迎使用代码片段) 我现在正在重新阅读文档,这看起来确实是一个node 101问题,但这正是我要讨论的问题……无论如何,澄清一下这是基本情况: function onRequest(request, respon
function onRequest(request, response) {
doSomething();
response.writeHead(202, headers);
response.end("doing something");
}
function doSomething(){
// long-running operation
}
我希望立即返回响应,让doSomething()在后台运行
好的,考虑到节点的单线程模型,如果不生成另一个操作系统级的子进程,这似乎是不可能的。我的误解
在我的代码中,我需要的备份大部分是基于I/O的,所以node应该以一种很好的异步方式处理它。我想我要做的是在回复后将剂量调整到。结束,看看效果如何。正如supertopi所说,您可以看一看。但我认为,如果这种情况频繁发生,将损害服务器的性能。那我想你应该让他们排队。我想你应该看看离线处理作业(分布式)的方法。一些(仅举两个例子)消息队列是,。我看不出问题所在。您需要做的就是让
doSomething()
启动一个异步操作。它将立即返回,您的onRequest
将写回响应,客户端将收到他们的“OK,我启动了”消息
doSomething
不会一直坐在那里,直到数据库连接建立,或者等待您告诉它备份。它将立即返回,注册了稍后运行的回调。在幕后,您的数据库库可能正在为您创建一些线程,以使异步按其应有的方式工作,但您的代码不需要担心它;您只需立即返回,立即将响应发送到客户机,异步代码就会保持异步运行
(实际上,同步运行需要更多的工作——您必须将
响应
对象传递到doSomething
,并让doSomething
执行响应。备份完成后,在最内部的回调中结束
调用。当然,这不是您想要在这里执行的操作;您想要返回imedi)我相信您已经浏览了文档。我认为这取决于您流程的性质,但请看一下子流程。谢谢。我的问题似乎根源于对节点工作原理的深刻误解:)子流程是我想到的,尽管不是最简单的解决方案,见下面乔的回答。谢谢。我的问题似乎源于对节点工作原理的深刻误解:)使用队列似乎是一个非常好的主意。谢谢。似乎我的问题根源于对节点工作原理的深刻误解:)
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.
});
}