我发现了一篇关于相关主题的不同帖子(如何在退出时执行异步操作),但它可能不适用于 macOS,或者在运行 Node.js v14 时不再适用。
我原来的问题更复杂。我无法在 SIGINT 的回调(或异步回调)中正常工作setTimeout。await但后来我意识到我真正需要做的,首先也是最重要的是能够捕获并忽略SIGINT。
如果我能做到这一点,那么如果我愿意的话,我也可以关闭以响应 SIGINT。
所以我回到基础知识,看看是否可以简单地禁用 SIGINT。我不能。
我可以检测到 SIGINT,我可以用控制台消息或任何其他同步代码进行响应,但无论我做什么,我的代码都会关闭,而且很快就会关闭。
process.on('SIGINT', () => { console.log('here'); return false; });
process.on('SIGINT', () => { console.log('here'); return true; });
process.on('SIGINT', () => { console.log('here'); return undefined; });
process.on('SIGINT', () => { console.log('here'); return new Promise(resolve => { console.log(resolve); }); });
Run Code Online (Sandbox Code Playgroud)
Ctrl这些方法都无法阻止我的 Node.js 服务器在点击+后关闭C,或者以其他方式向进程发送 SIGINT。
更新:
当我通过运行我的服务器时node app.js,SIGINT 拦截正在正常工作!
显然,我已经被通过nodemon. 来自我的 IDE 终端的+或使用 …
例子:
with suppress(asyncio.CancelledError):
[await t for t in asyncio.all_tasks(loop=self.loop)
if t is not asyncio.current_task()]
Run Code Online (Sandbox Code Playgroud)
为了避免Task was destroyed but it is pending!警告,我必须在取消后等待任务,但等待它们会导致终端被垃圾邮件发送CancelledError。我知道它被取消了,但我不需要看到它。
使用contextlib.suppress此处会对取消产生负面影响吗?我可以避免看到取消的错误(或任务被破坏的警告而无需等待)的唯一其他方法是使用asyncio.wait而不是启动我的初始任务asyncio.gather。由于某种原因,wait似乎抑制了异常。我用了return_when=asyncio.FIRST_EXCEPTION一个wait又return_exceptions=True一个gather。但似乎无论我如何设置它们的关键字参数,都会打印异常,而不会gather打印异常。wait