2016-08-22 57 views
2

Data.Pool,createPool的第一个参数是“创建新资源的动作”。在Data.Pool中,如果创建新资源的操作引发异常,会发生什么情况?

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

(对于withResource函数,他们说:“如果操作抛出任何类型的异常,资源是破坏了,没有回到游泳池“,但是这看起来像是完全不同的东西,这似乎是之后这个资源已经成功创建了,所以我想这不是解决我上面问题的线索。 )

回答

2

直到您takeResourcetryTakeResource并且池中没有资源时才会创建资源。如果创建资源的操作引发异常,则该池将保持不变,并在调用代码中引发异常。如果您反复拨打takeResourcetryTakeResource,即使先前的调用已引发异常,create action也会重复执行。 withResource调用takeResource而不处理任何异常;如果创建资源的操作在takeResoure中引发异常,则会在调用withResource的代码中引发异常。


创建一个资源的代码是takeResourcetryTakeResource。它们之间的区别在于当used == maxResourcestakeResourceretry s; tryTakeResouce返回Nothing

当没有可用的条目,并usedmaxResources,他们都做到以下几点:

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

发生异常时创建资源资源inUse的数量没有改变,异常在调用takeResourcetryTakeResource的代码中引发。