Вопрос:

Что происходит в Data.Pool, если действие, создающее новый ресурс, вызывает исключение?

haskell pool

80 просмотра

1 ответ

338 Репутация автора

В Data.Pool , createPool«s первый параметр является„действие , которое создает новый ресурс“.

Что произойдет, если это действие вызовет исключение? Могу ли я контролировать то, что происходит? (Боюсь, что это пойдет в бесконечный цикл, где он постоянно пытается создать новый ресурс.)

(Для withResourceфункции они говорят: «Если действие выдает исключение любого типа, ресурс уничтожается и не возвращается в пул». Но это кажется совершенно другой вещью. Это, кажется, происходит после того, как ресурс уже был успешно создан. Поэтому я думаю, что это не ключ к ответу на мой вопрос выше.)

Автор: haskellHQ Источник Размещён: 22.08.2016 08:36

Ответы (1)


2 плюса

22129 Репутация автора

Решение

Ресурсы не создаются, пока вы takeResourceили tryTakeResourceнет ресурса в пуле. Если действие по созданию ресурса вызывает исключение, пул остается неизменным, и исключение вызывается в вызывающем коде. Если вы повторяете вызов takeResourceили tryTakeResourceдаже когда предыдущие вызовы вызывали исключения, действие создания будет выполняться повторно. withResourceзвонки takeResourceбез обработки каких-либо исключений; если действие, создающее ресурс, вызывает исключение в takeResoureисключении, будет вызвано при вызове кода withResource.


Код, который создает ресурс, находится в takeResourceи tryTakeResource. Разница между ними в том, что когда used == maxResources takeResource retrys; tryTakeResouceвозвращается Nothing.

Когда нет доступных записей, и usedнет maxResources, они оба делают следующее:

create `onException` atomically (modifyTVar_ inUse (subtract 1))

Когда возникает исключение при создании ресурса, количество ресурсов inUseне изменяется, и исключение возникает в коде, вызывающем takeResourceили tryTakeResource.

Автор: Cirdec Размещён: 22.08.2016 10:25
Вопросы из категории :
32x32