#concurrency #race-condition #yesod
#параллелизм #условие гонки #yesod
Вопрос:
Yesod когда-либо чередует запуск нескольких обработчиков? т. Е. Может ли другой обработчик Yesod из того же процесса выполняться между действиями монады обработчика?
Ответ №1:
Да, Yesod будет делать это регулярно.
Комментарии:
1. Я совершенно уверен, что в книге об этом не говорится. В любом случае, как вы должны синхронизировать обработчики — являются ли постоянные вызовы завернутыми в повторяющуюся транзакцию или что-то в этом роде? Кроме того, на каком уровне происходит параллелизм — переключается ли контекст среды выполнения Haskell в середине действия liftio’d?
2. Warp использует
forkIO
вызов для его параллелизма. Другими словами, он использует стандартные примитивы параллелизма Haskell. Вопросы, которые вы здесь задаете, являются фундаментальными, я бы настоятельно рекомендовал ознакомиться с моделью потоков Haskell. Книга Саймона Марлоу была бы отличным началом.3. Как контролируется одновременный доступ к GHState?
4. Вы задаете вопросы в середине темы. Сначала вам нужно понять примитивы параллелизма, предлагаемые GHC. Короткий ответ на ваш вопрос заключается в том, что каждый поток имеет отдельный GHState, и параллельный доступ не блокируется.
5. Итак, может быть несколько обработчиков (postMyRouteR), запущенных одновременно, но любой объект GHState обработчика может быть доступен только ему? Если я хочу состояние между обработчиками, мне нужно их правильно синхронизировать?