如何查询计划任务的状态(是否有效)?

Sza*_*lcs 5 wolfram-mathematica mathematica-8

检查计划任务是否处于活动状态的首选方法是什么?

我将在下面概述我的解决方案,但我不确定这确实是最好的方法.


计划任务的创建方式如下:

In[1]:= myTask=CreateScheduledTask[Print["task 1"], 30]

Out[1]= ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False]
Run Code Online (Sandbox Code Playgroud)

我们可以检查这样的现有任务:

In[2]:= ScheduledTasks[]
Out[2]= {ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False]}
Run Code Online (Sandbox Code Playgroud)

ScheduledTaskObject(TrueFalse)中的最后一个条目似乎表示任务是否已启动.

现在让我们开始任务,并将变量的内容myTask与返回的列表进行比较ScheduledTasks[].

In[3]:= StartScheduledTask[myTask]
Out[3]= ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False]

In[4]:= {ScheduledTasks[],myTask}
Out[4]= {{ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,True]},
          ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False]}
Run Code Online (Sandbox Code Playgroud)

请注意,它们不同.变量显示Falsewhile ScheduledTasks[]显示为false.这表明该变量实际上并不包含任务对象.通过myTask直接修改变量,我们无法修改任务.任务的真实状态由返回ScheduledTasks[].

尽管ScheduledTaskObject表达式中的第一个条目是与任务相对应的唯一编号,但看起来是合理的.因此,对任务执行的任何手动操作都可以使用此数字作为"句柄",我们可以使用以下标识符检查任务状态1:

Cases[ScheduledTasks[], ScheduledTaskObject[1,__,state_] :> state]
Run Code Online (Sandbox Code Playgroud)

我完全不确定这种方法(使用来自的标识符ScheduledTaskObject)是否正确.我注意到在新内核中已经有一些任务的情况(可能是由于前端---我打开了几个笔记本,有些是动态元素,我一直在试验任务),有时会ScheduledTasks[]返回几个任务具有相同的标识符(通常0).

综上所述:

  1. 它是通过标识符处理任务的可靠方式(来自它们的第一个数字ScheduledTaskObject)?

  2. 鉴于我们CreateScheduledTask在第一次创建它时得到的表达式,查询计划任务状态的正确方法是什么?

编辑:如果可能的话,让动态单元显示计划任务的状态,而不使用太多的CPU也是很好的.有没有人对如何做到这一点有任何想法?

abc*_*bcd 5

ScheduledTaskObject确实id用于第一个参数的文档,我认为它确实是独一无二的.我无法ScheduledTaskObjects使用您声明的相同ID 复制多个(也没有0),所以如果您能提供一个最小的例子,那就太好了.

在任何情况下(假设多个任务具有相同的ID),您还可以通过检查任务的确切定义来缩小匹配范围.这是对你的简单修改.

 Clear@pollState
 pollState[task_ScheduledTaskObject] := 
 Module[{id = Level[task, 1][[1]], expr = Level[task, 1][[2]]},
  out = Cases[ScheduledTasks[], 
    ScheduledTaskObject[Evaluate@id, Evaluate@expr, __, state_] :> 
     state];
  Return[If[out === {}, "Task not found", First@out]]]
Run Code Online (Sandbox Code Playgroud)

您可以创建Dynamic任务状态的输出,并将更新间隔设置为1秒(或更多),以便它不会不断轮询状态,从而减慢您的速度.

Dynamic[Refresh[pollState[myTask], UpdateInterval -> 1]]
Run Code Online (Sandbox Code Playgroud)