我已经建立了一个门户网站,其中一个页面列出了Octopus Deploy的版本。但是,每个版本所需的一些信息都保存在数据存储(共享驱动器)中的zip中。
我目前从Octopus的API获得版本然后检查mongo db
我已经访问过的zip文件中存储的信息,所以我们只需要在第一次创建时读取zip文件。
这个目前的逻辑都可行,但是当它第一次读取zip文件时它完全阻塞了。所以我把它放在一个运行良好的子进程中。
目前,每次用户点击发布页面时,所有这些的逻辑都会运行。如果章鱼部署的所有结果都在数据库中,那么它只返回那些结果。如果不是,它将返回结果,然后在子进程将数据库插入数据库后,使用socket io返回从zip文件中读取的信息。
现在的实际问题/问题。如果用户A点击页面并从章节中获取不在数据库中的版本,则每次用户点击页面时它都会运行,它将启动子进程以读取zip。如果用户B在用户A的子进程完成之前命中页面,他们也将从不在数据库中的章鱼获得释放,因此将尝试命中子进程以执行与用户A相同的操作。但是因为代码到读取zip文件阻止它等待所有zip文件从用户A读取然后重复用户B的进程。
我如何检查子进程是否已经在执行zip读取,如果没有则执行,如果是,则执行其他操作?
我尝试设置'inuse'变量并在尝试在子进程中以及在调用它的模块中执行read zips函数时进行检查。麻烦在于子进程中,zip读取函数阻止它,一旦完成将使用中的变量设置为false,因此排队的调用运行相同的事情。在模块中,每次用户加载页面时都会加载它,因此将其重置为默认值false,因此始终会调用read zip函数。
答案 0 :(得分:5)
检查退出事件监听器。 http://nodejs.org/api/child_process.html#child_process_event_exit
然后你将某些逻辑作为维持状态的某种全局对象。就像我们在启动子项时设置一个标志,并在ext事件触发时将其设置为off。