Программирование продолжительного основанного на времени процесса

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

Я храню свои соответствия в базе данных SQLite, которым присоединили DateTime к ней.

Я хочу записать приложение, которое проверяет каждый час или так видеть, должны ли какие-либо новые матчи быть сыграны и порождают те потоки прочь.

Я не могу полагаться на планировщика задач для выполнения этого каждый час, потому что существуют объекты, которые совместно использовали бы различные экземпляры того процесса (конкретно объект турнира), который я подозреваю, был бы перезаписан более новым процессом, когда сохранено назад в DB. Так идеально я должен записать своего рода продолжительный процесс, который спит между часами.

Я записал свою объектную модель так, чтобы каждый объект был только загружен однажды из памяти, поэтому, пока все потоки моделирования порождены из этого приложения, они не должны перезаписывать данные.

Править: Больше детали о требованиях

В основном несколько соответствий должны смочь работать одновременно. Эти соответствия могут иметь произвольную длину, таким образом, не необходимо, чтобы каждый закончил перед другим начинается (на самом деле, в большинстве случаев будет несколько соответствий, выполняющихся одновременно).

То, что я предполагаю, является программой, которая работает в фоновом режиме (сервис, я предполагаю?), который спит в течение 60 минут и затем проверяет базу данных, чтобы видеть, должны ли какие-либо игры быть запущены. Если существует кто-либо, чтобы быть запущенным, это исчерпывает потоки для моделирования тех игр и затем возвращается ко сну. Следовательно, потоки моделирования работают, но поток "планирования" спит в течение еще 60 минут.

Причина я не могу (я думаю) использует интерфейс планирования задач ОС по умолчанию, то, что они требуют, чтобы задача была выполнена, чтобы быть отвергнутой как новый процесс. Я разработал свой объект базы данных, моделируют таким образом, что они кэшируются каждым классом объекта на первой загрузке (ссылка памяти) подразумевать, что каждый объект только загружается из памяти однажды и что ссылка используется на всех, сохраняет. Означание, что, когда каждый поток моделирования сделан и сохраняет от его состояния, та же ссылка используется (с обновленным состоянием) для сохранения от состояния. Если другой исполняемый файл будет запущен каждый раз, то когда по-видимому, другая ссылка памяти будет открыта каждым процессом, и следовательно один процесс мог сохранить в DB и перезаписать состояние, записанное другим процессом.

Сервис похож на способ пойти. Существует ли способ сделать сервис просто спать в течение 60 минут и проснуться и выполнить функцию после этого? Я испытываю желание делать это, стандартное консольное приложение потратило бы впустую память, но я не знаю, существует ли эффективный способ сделать это, о котором я не знаю.

1
задан sohum 26 July 2010 в 00:10
поделиться

2 ответа

Если вы хотите сделать его действительно надежным, сделайте его службой.

Но я не вижу никаких проблем в том, чтобы сделать его обычным (Console, WinForms, WPF) приложением.

Может быть, вы могли бы немного расширить требования.

2
ответ дан 2 September 2019 в 22:46
поделиться

Причина, по которой я не могу (как я думаю) использовать стандартный интерфейс планирования задач ОС, заключается в том, что они требуют, чтобы выполняемая задача была запущена как новый процесс. Я разработал модель объектов моей базы данных таким образом, что они кэшируются каждым классом объектов при первой загрузке (ссылка на память), что означает, что каждый объект загружается из памяти только один раз, и эта ссылка используется при всех сохранениях

Если вы хотите, чтобы все оставалось в кэше вечно, тогда вам нужно приложение, которое просто работает вечно. Вы можете сделать это службой windows или обычным приложением windows.
Служба windows - это обычный exe, который соответствует API диспетчера служб. Если вы хотите создать такую службу, в visual studio есть мастер, который автоматически генерирует для вас скелетный код. По сути, вместо метода Main у вас есть класс Service с методом Run, а все остальное - то же самое.

При желании вы можете использовать планировщик задач windows для планирования своих действий. Для этого нужно, чтобы в фоновом режиме работала давно запущенная служба windows, которая ничего не делает. Пусть она откроет TCP-сокет или именованную трубу или что-то еще и просто сидит там. Затем напишите небольшой "stub" exe, который просто подключается к этому сокету или именованной трубе и говорит фоновому приложению проснуться.
Это, конечно, гораздо сложнее, чем просто выполнить sleep в вашем фоновом приложении, но это позволяет вам иметь гораздо больше контроля - вы можете изменять время сна без перезапуска фоновой службы, запускать ее по требованию и т.д.


Однако я бы рассмотрел ваш дизайн. Тот факт, что вы полагаетесь на долго работающую службу, является большой точкой отказа. Если ваше приложение должно работать в течение нескольких дней, а у вас возникнет одна ошибка, которая выведет его из строя, то вам придется начинать все сначала. Гораздо лучшей архитектурой является модель Unix, где у вас есть небольшие процессы, которые запускаются, делают что-то одно, а затем завершаются (в данном случае, обработка каждой игровой симуляции как отдельного процесса, так что если одна из них умирает, это не приводит к сбою главного процесса или других симуляций).

Похоже, что основная причина, по которой вы пытаетесь сделать процесс долгоиграющим, - это кэширование запросов к базе данных. Нужно ли вам вообще это делать? В большинстве случаев базы данных работают достаточно быстро (у них есть собственные кэши, которые достаточно умны). Распространенная ошибка, которую я видел у программистов, - это предположение, что что-то вроде базы данных работает медленно, и трата кучи времени на оптимизацию, когда на самом деле все было бы в порядке

.
0
ответ дан 2 September 2019 в 22:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: