我正在使用亚马逊提供的Node.JS库来管理EC2和自动抓取组。我写了一个删除实例的程序,这样自动伸缩组就会创建一个新的实例。但在删除任何额外的实例之前,我需要确保新实例是由amazon生成的并且正在运行。为此,我需要暂停我的程序,并不断检查,直到我得到一个肯定的响应。所以它是这样工作的
(我通常有3-4个实例,必须替换为3-4个新类型的实例。)
所以我的程序是--
updateServer(){
Which has the code to retrieve the instances from the server.
foreach(instance in the list of instances){
replace(); (with new one.)
}
}
replace() {
delete the old one.
while(new instance is not generated) {
check();
}
}
check(){
return the status.
}
现在的问题是,我需要这一切按顺序发生。如何暂停程序?因为在我的例子中,foreach循环执行,程序结束,它不会进入那个check循环。你能给我点子吗?
谢谢
链接-- http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/frames.html
发布于 2013-07-23 19:23:02
你在这里描述的问题是一个' polling ',虽然‘暂停’在节点的异步编程模型中通常是一个反模式,但轮询可能是它具有有效应用程序的一种情况。
但是,出于代码可维护性的原因-在这种情况下,可以稍后添加其他任务(例如其他检查),您还应该异步处理轮询。
这里有一些不同的方法可以解决你的问题。
1。根本不要在node.js中处理这个问题-从主机的crontab调用节点应用程序,并设计程序退出。虽然这不是很像节点,但它确实是一个健壮的解决方案。
2.使用npm安装节点定时器模块https://github.com/markussieber/timer.使用定时器,您可以将check()函数作为参数传递,这样它就会定期回调它。这比较不可靠,但可以扩展,因为您可以运行许多检查,这对于可伸缩的EC2部署来说可能是需要的。
timer = require('timer'); //import the time module
function check(){ //check function now polls
//add an if(something==true) statement here to allow you to exit if necessary
console.log("Checking stuff");
timer.timer(200, check); //calls this function repeatedly every 200ms
}
check(); //starts the code polling
亚马逊3.Amazon Elastic Beanstalk http://aws.amazon.com/elasticbeanstalk/.提供的功能听起来和 Autoscaling http://aws.amazon.com/autoscaling/提供的功能是一样的你可能也会有一些运气。
Happy node hacking :)
发布于 2013-07-23 08:45:47
nodejs不是用来暂停的,真的。您可能正在寻找类似于eventEmitter的东西,这样您就可以在发出事件时调用函数。http://nodejs.org/api/events.html
发布于 2013-07-23 10:52:44
您不应该在node中暂停。看一看异步(https://github.com/caolan/async)。您需要的可能是async.forEachSeries(),它允许您串行但异步地做事情。
在本例中,它将启动一台服务器,当服务器启动时,将调用一个回调,使该系列在下一台服务器上继续运行,等等。
以下是node-levelup https://github.com/rvagg/node-levelup/blob/master/test/benchmarks/index.js#L60-L84中的一些示例代码
https://stackoverflow.com/questions/17799335
复制相似问题