2016-08-22 2 views
2

В первом параметре Data.Pool, createPool «действие, которое создает новый ресурс».В Data.Pool, что произойдет, если действие, создающее новый ресурс, выдает исключение?

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

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

ответ

2

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


код, который создает ресурс в takeResource и tryTakeResource. Разница между ними заключается в том, что когда used == maxResourcestakeResourceretry s; tryTakeResouceNothing.

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

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

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

Смежные вопросы