Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading &引用;产生一个线程"-类似node.js中的行为_Multithreading_Node.js - Fatal编程技术网

Multithreading &引用;产生一个线程"-类似node.js中的行为

Multithreading &引用;产生一个线程"-类似node.js中的行为,multithreading,node.js,Multithreading,Node.js,我想在一个小Web应用程序中添加一些管理实用程序,例如“备份数据库”。用户将单击按钮,HTTP响应将立即返回,尽管潜在的长时间运行过程已在后台启动 在Java中,这可能是通过生成一个独立线程来实现的,在Scala中是通过使用一个参与者来实现的。但是node.js中合适的习惯用法是什么?(欢迎使用代码片段) 我现在正在重新阅读文档,这看起来确实是一个node 101问题,但这正是我要讨论的问题……无论如何,澄清一下这是基本情况: function onRequest(request, respon

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

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

我现在正在重新阅读文档,这看起来确实是一个node 101问题,但这正是我要讨论的问题……无论如何,澄清一下这是基本情况:

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