Приведенный выше ответ верен, но он не имеет отношения к некоторым реальным проблемам.
Сначала перезапускается сервер.Если ваше хранилище больше, чем кэширование, оно должно быть долговечным при перезапусках сервера.
Второе - это перезагрузка кода.Будущие версии Snap, начиная с версии 0.3 (вероятно, в начале декабря), будут иметь динамическую перезагрузку кода при использовании в разработке.Это огромное преимущество с точки зрения скорости разработки, но оно делает локальное состояние сервера интересным умственным упражнением.Если программист изменяет тип / инициализацию / что-либо из локального состояния сервера, он должен быть повторно инициализирован.Там есть некоторые огромные инженерные проблемы.
Когда я писал код динамической перезагрузки для 0.3, я некоторое время боролся с этой проблемой.Затем я посмотрел на другие платформы.PHP?Хранит все внешне (база данных, memcache, что угодно).Нет хранения кросс-запросов в памяти вообще.Рубин на рельсах?То же самое.
В сочетании с проблемами, присущими первой проблеме, я пришел к выводу, что сервер должен быть без сохранения состояния, за исключением возможной оптимизации кэширования.Оставьте проблемы долговечности для библиотек / внешних процессов, которые предназначены для него.
Поэтому я разработал общий интерфейс, используемый загрузчиками для производства и разработки (один использует статическую загрузку, другой динамическую загрузку) для выполнения 3 функций:функция инициализации, функция очистки и обработчик, который использует состояние, возвращаемое функцией инициализации.В рабочем режиме это сводится к инициализации вызова при запуске сервера и очистке при завершении работы сервера.В режиме разработки он компилируется так: для каждого запроса динамически загружаются все 3, затем запускаются init, handler, cleanup.Очевидно, что ни одно состояние не выдержит перекрестного запроса таким образом.
И тогда я отвечу так: сделайте хранилище перекрестных запросов с помощью какого-либо механизма со встроенной надежностью, и состояние сервера будет просто интерфейсом для этого,Используйте что-то вроде happstack-state или sqlite, если вы хотите работать в процессе, или базу данных или какое-то другое внешнее хранилище, если вы хотите работать вне локального процесса.
Как добавленная заметка, управление "глобальным"«Ресурсы, такие как пул соединений и т. п., также намного проще в Snap 0.3 благодаря добавлению интерфейса MonadSnap.