我正在考虑使用TVar将某些状态存储在Web应用程序中(可以在重新启动时重新创建)。但是,TVar的竞争方面使我感到担忧。似乎频繁发生的短期交易可以通过不断地中断它们来饿死更长的交易。此外,随着运行时间更长的事务继续重新启动,这将增加CPU的负载,从而进一步增加这些事务的长度。最终,我觉得这可能导致服务器完全不响应。
考虑到这一点,我有以下问题:
(1)TVar(或其他数据类型)可以使用锁,而不是同时尝试/重试。
(2)TVar(或另一种数据类型)是否可以具有某些不同的争用机制,即“让事务在运行另一项事务之前先运行一秒钟”,或者至少可以保证事务最终将完成(即一种争用算法,它阻止starvation用于运行时间更长的交易)。
最佳答案
仅当您有许多更新数据的廉价交易和一些读取数据的昂贵交易时,这才是一个问题。也许对实时更新的数据集进行分析。
如果您确实对此感到担心,请考虑使用国旗TVar。将其设置为false,并在每次廉价交易开始时检查其是否为false,否则调用retry
。然后,只需在进入长期事务之前将其设置为true即可,而在退出时将其设置为false即可。或者,您可以在TMVar
后面简单地保护自己的状态。您长时间运行的计算以原子方式获取tmvar,执行其感觉,然后将其返回。其他事务完全在单个实际STM事务中进行。
还要记住,长时间运行的STM事务有点棘手。由于懒惰,您可以廉价地将昂贵的值放入var中。您还可以非常快速地从一大堆var中读取数据的“快照”。要拥有真正长时间运行的事务,您需要从一大堆var中读取,然后根据您所读取的内容,计算要向其中写入新值(或从中读取值)的var,以及该计算本身一定很贵。因此很可能您甚至都不是那种情况!
关于haskell - Haskell:TVar:防止饥饿,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10099990/