检查子进程是否正在运行

9
我已经建立了一个门户网站,其中一个页面列出了来自Octopus Deploy的发布。然而,每个版本需要的一些信息保存在数据存储(共享驱动器)中的zip文件内。
我目前从Octopus的API获取发布,然后检查一个mongo db,其中存储了我已经访问过的zip文件中的信息,因此我们只需要读取一次zip文件,即第一次创建它们时。
当前的逻辑都可以正常工作,但是当第一次读取zip文件时,它会完全阻塞。因此,我将其放在一个子进程中,该子进程运行良好。
目前,所有这些逻辑每次用户点击发布页面时都会运行。如果octopus deploy的所有结果都在数据库中,则仅返回这些结果。如果没有,它将返回它所拥有的结果,然后使用socket io返回从zip文件中读取的信息,一旦子进程将其插入到数据库中。
现在实际的问题/问题是:由于每次用户点击页面时都会运行,如果用户A点击页面并获得数据库中不存在的Octopus发布,它将启动子进程来读取zip。如果在用户A的子进程完成之前,用户B也点击了页面,则他们也会从Octopus获取不在数据库中的发布,并尝试调用与用户A相同的子进程执行相同的操作。但是,由于读取zip文件的代码是阻塞的,它将等待从用户A读取所有zip文件,然后为用户B重复此过程。
我该如何检查子进程是否已经执行了zip读取操作?如果没有,则执行它,如果有,则执行其他操作?
我尝试设置一个“inuse”变量,并在尝试在子进程中执行读取zip函数以及调用它的模块中进行检查。问题是,在子进程中,zip读取功能会阻塞它,一旦完成,会将in-use变量设置为false,因此排队的调用运行相同的内容。在模块中,每次用户加载页面时都会加载它,因此它被重置为false的默认值,因此总是调用read zip函数。

检查退出事件监听器。http://nodejs.org/api/child_process.html#child_process_event_exit - Kamran Shahid
@KamranShahid这不是在子进程完成时触发吗?如果用户A启动了子进程,那么这将如何工作。 "读取zip文件"功能正在进行中。然后,用户B访问该页面,并想知道“读取zip文件”功能是否正在进行中? - ste2425
一些全局对象来维护状态。就像我们在启动子进程时设置一个标志,并在外部事件触发时将其关闭。 - Kamran Shahid
1
@KamranShahid 这很完美,就是我所做的,创建了一个包含运行信息和关于当前读取的一些其他zip文件的高级作用域对象。谢谢。 - ste2425
太好了。我将其添加到答案中,请接受它作为答案,以便也可以帮助其他人。 - Kamran Shahid
1个回答

9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接