【发布时间】:2020-03-13 18:13:34
【问题描述】:
我正在等待停止(发送异常)到 SIGINT 上正在运行的承诺。 doc 中给出的示例退出整个过程,而不仅仅是一个工人。
有人知道如何“杀死”、“取消计划”、“停止”正在运行的线程吗?
这是针对p6-jupyter-kernel 问题或REPL issue。
当前的解决方案是重新启动 repl 但不杀死阻塞的线程
await Promise.anyof(
start {
ENTER $running = True;
LEAVE $running = False;
CATCH {
say $_;
reset;
}
$output :=
self.repl-eval($code,:outer_ctx($!save_ctx),|%adverbs);
},
$ctrl-c
);
【问题讨论】:
-
在 Liz 的回答中,您会写“like
pthread_cancel”。链接的文档开始“向线程发送取消请求”并描述了合作取消。 Raku 已经有合作的Cancellation。这就是 Brad 在 his answer to Is it possible to terminate a promise's code block from another promise? 中显示的内容,大概是 Liz 所说的“线程可以每隔一段时间检查一次标志,如果设置了该标志就决定将其退出。” -
我不知道以下内容是否与您的情况有关,但是...我找到了 Jonathan 几周前发布的 an answer related to cancellation。在其中他写道“看看使用
Supply范式,其中有一个取消模型(关闭水龙头)”。他在答案下方添加的评论中写道:“当我们在核心中有某种Promise取消条款时”。需要明确的是,这是相对于非常不同的背景编写的,但在我看来,他提供的一些信息很可能与您的场景相关。 -
Tk @raiph,我没有看到那些帖子。我对它们进行了测试,它们阻止代码被执行(
Cancelation)或停止等待(关闭tap),但不会停止一些后台执行。我会想办法不时询问一个线程来检查bool-must-die -
好吧,我忘了精确(重要)线程中运行的代码不在我手中。它属于 repl 的用户。但是,你是对的,检查
.cancelled是正确的方法。我仍然必须不时绕道“客户端”线程来检查它。 -
“在投入大量精力之前与乔纳森讨论这个问题” -> 我给他发了一封电子邮件。他绝对是给我出路的最佳人选。我想在低级别做一些工作是唯一的方法。必须附带一些高级别的测试。感谢您的提示。
标签: asynchronous raku