【问题标题】:How to catch interrupts generated by TimeConstrained?如何捕捉 TimeConstrained 产生的中断?
【发布时间】:2011-09-28 16:51:00
【问题描述】:

Mathematica 具有CheckAbort 函数,该函数允许捕获和处理用户生成和编程的Aborts。但它不允许捕捉TimeConstrainedMemoryConstrained等函数产生的中断:

TimeConstrained[CheckAbort[Pause[100], Print["From CheckAbort"]], 1]

(不打印"From CheckAbort")。

有没有办法在 Mathematica 中捕获此类中断?

编辑:我知道TimeConstrainedMemoryConstrained 的第三个参数允许在中断的情况下评估一些代码,但这种方式不是我需要的:我需要一种方法完全在我的函数内部处理此类中断,允许用户不关心其内部。

附:我需要这个的原因是我有一个创建 MathLink 对象的函数,在任何中断或中止的情况下必须关闭该对象,但在其他情况下则不需要。

【问题讨论】:

    标签: wolfram-mathematica


    【解决方案1】:

    此构造以未记录的形式提供。

    Internal`WithLocalSettings[
      preprocessing,
      code,
      postprocessing]
    

    将导致在从中止或各种类型的跳转返回之前进行后处理。

    另见:

    Reliable clean-up in Mathematica

    Import big files/arrays with mathematica

    丹尼尔·利希特布劳

    【讨论】:

    • Internal`WithLocalSettings 在任何情况下都会评估postprocessing,而不仅仅是在发生中断时。在对我的函数进行任何评估后,我不需要关闭 MathLink 连接 - 仅当发生一些中断或中止时。
    • 如果引入“完成”标志,这可能会起作用,例如TimeConstrained[Module[{done=False},Internal`WithLocalSettings[Print@"start",Pause[100];done=True,If[!done, Print@"Interrupted!"]]], 5]
    • @WReach 好主意!但是您的解决方案不保留 TimeConstrained 的语义,它在满足时间约束时从函数返回输出。我还希望避免对我的函数的输出进行双重评估。
    • @Leonid 我觉得您的第一次编辑非常接近解决方案,但无法找到关键 - WReach 已经给出了它。我将发布 WReach 解决方案的改进版本作为单独的答案。
    • @Alexey 好的,WReach 的代码要简单得多。我尝试了类似的事情,但不知何故错过了这种可能性。我会留下我的答案一段时间,然后将其删除。根据 WReach 的建议单独发布答案听起来也是一个好主意。
    【解决方案2】:

    这是 WReach 解决方案的改进版本(他在 Daniel Lichtblau 对答案的评论中提出了建议)。我应该重新定义我的函数f 如下(现在将其称为ff):

    ClearAll[ff];
    SetAttributes[ff, HoldAllComplete];
    ff[expr_] /; (Unset[done]; True) := 
     Internal`WithLocalSettings[Null, done = f[expr], 
      AbortProtect[If[! ValueQ[done], Print["Interrupt!"]]; Unset[done]]]
    

    例子:

    ff[1 + 1]
    (*=>f[2]*)
    TimeConstrained[ff[Pause[10]; 1 + 1], 1]
    (*=> prints "Interrupt!"*)
    TimeConstrained[ff[Pause[.10]; 1 + 1], 1]
    (*=>f[2]*)
    

    【讨论】:

      【解决方案3】:
      TimeConstrained[Pause[100], 1, Print["-->Aborted"]]
      

      MemoryConstrained[100!, 1, Print["-->Aborted"]]
      

      【讨论】:

      • 我的意思是一种完全在我的函数内部捕获中止的方法,允许用户不关心关闭我的MathLink 连接。
      • @Alexey outerFunc[x_]:=TimeConstrained[innerFunc[x],10, Print[..]]? ......躲避它......
      • 我不需要 TimeConstrained 在我的函数内部。我只是希望允许用户使用它而不会有遇到问题的风险。
      • @Alexey 你能发布一个你打算使用的例子吗?我的意思是,第三个论点未涵盖的一个。
      • 给定 f[expr] 作为我在从属内核中评估 exprMathLink 函数,我希望允许用户编写 TimeConstrained[f[expr],10] 而无需关心 f 的内部结构(不使用第三个参数)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      相关资源
      最近更新 更多