Wolfram mathematica 如何查询计划任务的状态(活动或不活动)?
检查计划任务是否处于活动状态的首选方法是什么? 我将在下面概述我的解决方案,但我不确定这确实是最好的方法Wolfram mathematica 如何查询计划任务的状态(活动或不活动)?,wolfram-mathematica,mathematica-8,Wolfram Mathematica,Mathematica 8,检查计划任务是否处于活动状态的首选方法是什么? 我将在下面概述我的解决方案,但我不确定这确实是最好的方法 计划任务的创建方式如下: In[1]:= myTask=CreateScheduledTask[Print["task 1"], 30] Out[1]= ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False] In[2]:= ScheduledTasks[] Out[2]= {ScheduledTaskObj
计划任务的创建方式如下:
In[1]:= myTask=CreateScheduledTask[Print["task 1"], 30]
Out[1]= ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False]
In[2]:= ScheduledTasks[]
Out[2]= {ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False]}
Cases[ScheduledTasks[], ScheduledTaskObject[1,__,state_] :> state]
我们可以检查以下现有任务:
In[1]:= myTask=CreateScheduledTask[Print["task 1"], 30]
Out[1]= ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False]
In[2]:= ScheduledTasks[]
Out[2]= {ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False]}
Cases[ScheduledTasks[], ScheduledTaskObject[1,__,state_] :> state]
ScheduledTaskObject
(True
或False
)中的最后一个条目显示任务是否已启动
现在,让我们启动任务,并将变量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]}
请注意,它们有所不同。变量显示为False
,而ScheduledTasks[]
显示为False。这表明变量实际上并不包含任务对象。通过直接修改变量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]}
假设ScheduledTaskObject
表达式中的第一个条目是对应于任务的唯一数字,这似乎是合理的。因此,对任务执行的任何手动操作都可能使用此数字作为“句柄”,我们可以使用标识符1
检查任务的状态,如下所示:
In[1]:= myTask=CreateScheduledTask[Print["task 1"], 30]
Out[1]= ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False]
In[2]:= ScheduledTasks[]
Out[2]= {ScheduledTaskObject[1,Print[task 1],{30,Infinity},Automatic,False]}
Cases[ScheduledTasks[], ScheduledTaskObject[1,__,state_] :> state]
我完全不确定这种方法(使用
ScheduledTaskObject
中的标识符)是否正确。我注意到在新内核中已经有一些任务的情况(可能是因为前端——我打开了几个笔记本,一些带有动态元素,我一直在试验任务),有时ScheduledTasks[]
返回几个具有相同标识符的任务(通常0
)
总之:
ScheduledTaskObject
中的第一个数字)处理任务是否可靠CreateScheduledTask
获得的表达式,查询计划任务状态的正确方法是什么编辑:如果可能的话,最好有一个动态单元格显示计划任务的状态,而不使用太多CPU。有人知道如何做吗?ScheduledTaskObject的文档确实使用了
id
作为第一个参数,我认为它确实是独一无二的。我无法使用您声称的相同id(也不能使用0)复制多个ScheduledTaskObject
,因此如果您能提供一个简单的示例,那就太好了
在任何情况下(假设多个任务具有相同的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]]]
您可以创建任务状态的动态
输出,并将更新间隔设置为1秒(或更长),这样它就不会不断轮询状态,从而降低速度
Dynamic[Refresh[pollState[myTask], UpdateInterval -> 1]]
我将尝试给出一个最小的示例,尽管这并不容易,因为我相信这是由于一些前端交互。偶尔在
Quit
之后立即评估ScheduledTasks[]
会给出两个任务,两个任务的id都是0
@Szabolcs,如果id 0是专门为内核相关任务分配的,我不会感到惊讶。用户定义的任务都从1开始。只需包含一个排除0的检查(这是不必要的,因为myTask
将具有id>0
)就可以很容易地启动Mathematica,并计算某些内容。然后评估退出。然后评估ScheduledTasks[]
。我得到了一个包含三个元素的列表,所有元素的ID均为0:@Szabolcs谢谢,我现在可以复制它了。但是,这些任务看起来像内核初始化任务,应该在第一次评估后消失。事实上,如果您确实对某些内容进行评估,然后尝试ScheduledTasks[]
,您将得到{}
。我不认为这是个问题。即使您以后确实遇到了这些任务,您也可以安全地忽略0
id任务,因为您的任务肯定是id>0
。