Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wolfram mathematica 如何查询计划任务的状态(活动或不活动)?_Wolfram Mathematica_Mathematica 8 - Fatal编程技术网

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