dan*_*nja 5 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
}
Run Code Online (Sandbox Code Playgroud)
我希望响应立即返回,让doSomething()在后台运行.
好吧,鉴于节点的单线程模型似乎不可能产生另一个操作系统级别的ChildProcess.我的误会.
在我的代码中,我需要的备份主要是基于I/O,因此节点应该以一种漂亮的异步方式处理它.我认为我会做的是将doSomething转移到response.end之后,看看它是如何表现的.
正如supertopi所说,你可以看看Child过程.但我认为这会损害您的服务器的性能,如果这种情况顺序发生的话.然后我认为你应该排队他们.我认为您应该查看异步消息队列以脱机处理您的作业(分布式).一些(仅举两个)消息队列的例子是beanstalkd,gearman.
我没有看到问题所在。您所需要做的就是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.
});
}
Run Code Online (Sandbox Code Playgroud)
doSomething不会只是坐在那里直到建立数据库连接,或者等待您告诉它备份。它会立即返回,并注册了稍后运行的回调。在幕后,您的数据库库可能会为您创建一些线程,以使异步按其应有的方式工作,但您的代码不需要担心它;你只需立即返回,立即将响应发送给客户端,异步代码就会继续异步运行。
(实际上,要使其同步运行,需要做更多的工作 - 您必须将response对象传递到doSomething,并在备份完成后在最里面的回调中进行调用。当然,这不是您想要在这里做的;doSomething您response.end想要立即返回,这正是您的代码要做的。)
| 归档时间: |
|
| 查看次数: |
1832 次 |
| 最近记录: |