2015-04-28 41 views
0

我有一个我正在编写的mean.js应用程序,我在概念上对后台进程感到困惑。Mean.js Node.js后台进程

我需要在后台持续运行MongoDB的数据库进行操作和做的东西一样清理,电子邮件,微博的一些流程等

我需要很多的相同的功能和库我有在我的网络应用程序可用于这些背景特效。

这样做的最好方法是什么?我是否从一个全新的源代码基础开始,将这些工作程序像一个单独的应用程序一样对待?或者我创建一个守护进程文件夹,并在我用grunt启动server.js时分叉后台特效?

我觉得我很迷惑自己,可能会让它变得更加复杂。我查看了节点守护进程和child_processes以及simple_daemon。但我不知道要采取什么路径。

感谢您的帮助。

+2

一旦我得到了pm2,特别是'pm2 save',我不再担心它。它是最可维护的(imho)使用多个或多或少相同的应用程序的多个副本,一些只做bg的东西,一些接电话。如果你真的需要内存,你可以评论你不需要的背景工作者的部分,或者你甚至可以有条件地要求他们让同一个文件戴上很多帽子。 – dandavis

回答

2

您可以使用setInterval()在mean.js应用程序中运行计划或重复任务。由于node.js的工作方式,只要节点运行应用程序,定义在setInterval()或setTimeout()中运行的任何回调函数都将在加载后运行。这意味着您可以将后台逻辑保留在控制器/模型或相邻文件中。您可以包含您的后台脚本,例如从主要的app.js文件或从您的控制器,模型等的任何地方请求() - 它可以是例如

例如,

app.js:

require('tasks/doStuff'); 
require('express'); 

/* express/app stuff here */ 

任务/ doStuff.js:

require('mongoose'); 
require('some/other/stuff'); 

setInterval(function() { 
    console.log('interval happened'); 
}, 1000); 

这种方法确实需要一些设计/建筑方面的考虑。也就是说,您的任务现在与成功执行节点mean.js应用程序相关联。如果您的mean.js应用程序崩溃/死亡,您的任务也将死亡。

+0

啊。好的,这对我来说很有意义。但是我的困惑是:如果node.js应用程序是一个单线程的进程,并且我的setinterval thingy需要很长时间(比如说一个长查询)才会阻止传入的web请求? –

+1

理论上是的。但在实践中,不。只要你在长时间运行的函数上使用异步方法,你就不会阻塞该线程。这是Node.js的基础。这里更详细的:http://stackoverflow.com/questions/14795145/how-the-single-threaded-non-blocking-io-model-works-in-node-js –

+0

非常好!谢谢! –