Каков предпочтительный способ проверить, является ли запланированное задание активным или нет?Как запросить состояние (активное или нет) запланированной задачи?
Я опишу свое решение ниже, но я не уверен, что это действительно лучший способ сделать это.
запланированная задача создается следующим образом:
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]}
Последняя запись в 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[]
.
Разумеется предположить, что первая запись в выражении ScheduledTaskObject
является уникальным номером, соответствующим задаче. Таким образом, любая ручная операция, выполняемая на задаче может возможно использовать этот номер в качестве «ручки», и мы могли бы проверить состояние задачи с идентификатором 1
так:
Cases[ScheduledTasks[], ScheduledTaskObject[1,__,state_] :> state]
Я не уверен, хотя все что этот подход (с использованием идентификатора от ScheduledTaskObject
) является правильным. Я заметил ситуации, когда в новом ядре уже были какие-то задачи (возможно, из-за переднего конца - у меня было несколько ноутбуков, некоторые с динамическими элементами, и я экспериментировал с задачами), а иногда ScheduledTasks[]
возвращает несколько задачи с тем же идентификатором (обычно 0
).
В итоге:
Является ли это надежный способ для решения задач по их идентификатору (первый номер от их
ScheduledTaskObject
)?Каков правильный способ запроса состояния запланированной задачи, учитывая выражение, которое мы получаем от
CreateScheduledTask
, когда мы его впервые создали?
EDIT: Если это возможно, также было бы неплохо иметь динамические ячейки, показывающие состояние запланированных задач, не используя слишком много ресурсов процессора. Кто-нибудь есть идеи о том, как это сделать?
Я попытаюсь придумать минимальный пример, хотя это непросто, потому что я считаю, что это связано с каким-то интерфейсом. Иногда оценка 'ScheduledTasks []' сразу после 'Quit' давала две задачи, как с id' 0'. – Szabolcs
@Szabolcs Я не удивлюсь, если id 0 был назначен специально для задач, связанных с ядрами. Задачи, заданные пользователем, начинаются с 1. Возможно, просто включить проверку для исключения 0 (что не понадобится, поскольку 'myTask' будет иметь' id> 0') – abcd
Запустите Mathematica и оцените что-то. Затем оцените «Quit». Затем оцените 'ScheduledTasks []'. Я получаю список из трех элементов, все с ID 0: http://pastie.org/2778819 – Szabolcs