我有一个JavaScript程序,希望通过提供RabbitMQ的输入来持续执行。问题在于它有时会无限期地挂起并阻塞整个执行过程。我最初的想法是使用Promise.race
在特定时间段后超时并让下一条消息进入,但是损坏的Promise本身仍在后台运行,并且永远不会结束。在此设计中,我将开始生成“僵尸”承诺,这些承诺最终将消耗我的系统资源(因为我的应用程序一直在运行)。我对这个程序真的没有控制权。我无法向其发送abort()
函数。所以我的问题是:
是否有办法杀死Promise并将其完全从事件循环中删除?
如果不可能,那么将第二个nodejs程序作为子进程生成并在出现问题时将其杀死呢?会正确清理我的系统资源吗?
答案 0 :(得分:5)
有没有办法杀死Promise并将其完全从事件循环中删除?
不。承诺表示异步任务的结果 ,他们不知道任务本身,因此无法取消它。
如果不可能,那么将第二个nodejs程序作为子进程生成并在出现问题时将其杀死呢?
这是一个选择,但是生成进程是一项繁重的操作,因为它需要自己的运行时/内存/等。因此您不应该经常这样做。
您可以管理cancellation of the underlying asynchronous task。不过,这取决于实际的任务。
答案 1 :(得分:3)
您正在关注错误的部分(可以理解!)。 promise 没有挂起。您正在使用诺言来观察的事物已被挂起。承诺不做任何事情,它们只是提供一种观察正在完成的事情的方法。
要解决此问题,您需要查看它尚未完成的操作,然后在该级别解决问题。如果事物有某种取消或中止的方法,那就太好了;否则,请在更深层次上使该过程超时,并拒绝它的承诺。
如果不可能,那么将第二个nodejs程序作为子进程生成并在出现问题时将其杀死呢?会正确清理我的系统资源吗?
是的。它更昂贵,但这是一个折衷。如果挂起,您可以完全杀死它。