Запускает ли Yesod более одного обработчика одновременно (одновременно)

#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 обработчика может быть доступен только ему? Если я хочу состояние между обработчиками, мне нужно их правильно синхронизировать?