Как автоматически сохранять изображение Pharo каждый час?

Я хочу автоматически сохранять свое изображение Pharo каждый час.

Как бы вы сделали это автоматически внутри изображения?

Я видел, как это делает проект Pier. Но я не уверен, как они это делают.

ТИА


person elviejo79    schedule 11.01.2011    source источник


Ответы (3)


На SqueakSource есть проект Scheduler, который выглядит как cron для Smalltalk. Из обзора:

"Start a new task scheduler and keep it around"
scheduler := TaskScheduler new.
scheduler start.
"Let's save the image every hour"
scheduler
   do: [Smalltalk snapshot: true andQuit: false]
   every: 60 minutes.

Вы можете объединить это с кодом блокировки или saveImageInBackgroundNicely OSProcess, упомянутым выше, и получить хорошее простое решение.

person Sean DeNigris    schedule 12.01.2011
comment
Спасибо. Планировщик работает очень хорошо. Я просто использовал: do: [Текущий снимок SmalltalkImage: true и Quit: false.] А также сделал smalltalk Run as Adiministrator, чтобы он мог сохранить файл. - person elviejo79; 14.01.2011

Результат обсуждения в списке рассылки, с некоторой обледенением, чтобы запускать его только ежечасно:

[[self blockUI.
  self doUpdate.
  SmalltalkImage current snapshot: true andQuit: false.
  self unblockUI.
  (Delay forDuration: (Duration hours: 1)) wait] repeat] fork
person nes1983    schedule 11.01.2011
comment
Чуть ниже та же тема есть еще упоминание UnixProcess saveImageInBackgroundNicely из OSProcess, который может сохранять изображение с помощью фонового процесса Unix. Вы можете предпочесть использовать это, если не хотите, чтобы изображение блокировалось каждый час. - person Alex Jasmin; 11.01.2011
comment
Хм. Я не могу найти метод saveImageInBackgroundNicely в Pharo 1.1.1. Ни класс UnixProcess. Интересно, что там произошло? - person nes1983; 12.01.2011
comment
Этот класс взят из OSProcess, который не включен в базовый Pharo. - person Alex Jasmin; 12.01.2011
comment
Привет @ nes1983 Спасибо, это сохраняет изображение. Как сделать так, чтобы каждый час сохранялся? - person elviejo79; 12.01.2011
comment
Обратите внимание, что у Timespan есть метод с именем every:do:, и хотя его название интригует, он делает совсем не то, что вы ожидаете. Совсем не ждет. - person nes1983; 12.01.2011

Вы можете сделать это, и это может работать просто отлично.

Но я бы не стал этого делать.

Не для настойчивости в производстве.

Почему?

Потому что изображения похожи на ваш сеанс на вашем ноутбуке. Сохранение вашего изображения похоже на перевод вашего ноутбука в спящий режим: оно сохраняет все.

А в долгосрочной перспективе в каком-то штате будет какая-то необъяснимая хрень, которая может что-то усложнить и нужно будет делать хард ребут.

Попытки быть перфекционистом в этом не помогают (или, может быть, помогают, но уж точно неэкономичны). Это просто произойдет, и перезагрузка вашего ноутбука — дешевое решение для получения свежего состояния. Но это для вашего приложения smalltalk может быть не таким дешевым.

Жесткая перезагрузка в smalltalk будет означать, что вам нужно взять новый образ и снова загрузить весь свой код (это можно автоматизировать, но опыт подсказывает, что это может занять много времени).

person Sebastian Sastre    schedule 17.01.2011
comment
+1 за это мнение, но я не согласен. Постоянство на основе изображения может быть успешно использовано. Я думаю, что даже Dabble DB полагался на это (используя одно изображение для каждого клиента). Выявить определенные проблемы в сложном графе объектов может быть сложнее, чем в базе данных на основе схемы, и сам Squeak может обрабатывать только такое количество данных, но все дело в компромиссах. - person Alex Jasmin; 10.02.2011
comment
Кроме того, чтобы обеспечить разумное сохранение изображений, вам необходимо проявлять гибкость в отношении транзакций. Если сервер (или виртуальная машина) выйдет из строя по какой-либо причине до сохранения, это повредит. Не все приложения могут позволить себе роскошь не быть ACID. - person Sebastian Sastre; 15.04.2011