在Data.Pool中,如果创建新资源的操作引发异常会发生什么?

时间:2016-08-22 20:36:55

标签: haskell pool

Data.Pool中,createPool的第一个参数是“创建新资源的操作”。

如果此操作引发异常,会发生什么?我可以控制会发生什么吗? (我担心它会进入无限循环,不断尝试创建新资源。)

(对于withResource函数,他们说:“如果操作抛出任何类型的异常,资源就会被破坏,而不会返回到池中。”但这似乎完全不同。似乎发生了 之后资源已经成功创建。所以我想这不是我上述问题答案的线索。)

1 个答案:

答案 0 :(得分:2)

takeResourcetryTakeResource之前,资源尚未创建,且资源池中没有资源。如果创建资源的操作抛出异常,则池保持不变,并且在调用代码中引发异常。如果您反复调用takeResourcetryTakeResource,即使之前的调用已抛出异常,也会重复执行创建操作。 withResource调用takeResource而不处理任何例外情况;如果创建资源的操作在takeResoure中抛出异常,则会在调用withResource的代码中引发异常。

创建资源的代码位于takeResourcetryTakeResource。它们之间的区别在于used == maxResources takeResource retry s; tryTakeResouce会返回Nothing

如果没有可用的条目,并且used不是maxResources,则他们都会执行以下操作:

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

创建资源时发生异常时,资源inUse的数量未发生变化,并且在调用takeResourcetryTakeResource的代码中引发异常。