有界的“互斥体池”,用于同步实体行为

问题描述

我有一个功能

type Command struct {
  id Uuid
}

handleCommand(cmd Command) 
{
  entity := lookupEntityInDataBase(cmd.Uuid)
  entity.handleCommand(cmd)

  saveEntityInDatabase(entity)

}

但是,可以并行调用函数,并且假定实体是非线程安全的,这会导致实体状态和将保存在数据库中的状态不协调。

在此函数的开头和结尾处进行简单的互斥锁锁定将解决此问题,但是由于过于不同的实体(即不同的uuid)的实体应被允许并行处理其命令,因此会导致过于悲观的同步。

另一种选择是保留map[uuid]sync.Mutex的映射,如果以前没有遇到过uuid,则创建一个新的互斥体,然后以线程安全的方式创建它。但是,这将导致在运行时遇到的所有uuid的映射可能不断增长。

我考虑过事后清理互斥锁,但是这样做是线程安全的,并且意识到另一个线程可能已经在等待互斥锁了,所以打开了这么多罐蠕虫。

我希望我错过了一个非常简单而优雅的解决方案。

解决方法

真的没有一个优雅的解决方案。这是使用渠道的版本:

$str='online shop';
echo html_entity_decode($str);
//outputs: online shop
var_dump(strpos(html_entity_decode($str),'online shop'));
//outputs: bool(false)
,

Moby项目有一个库,请参阅https://github.com/moby/locker

单行描述是

locker提供了一种用于创建更细粒度的锁定的机制,以帮助释放更多的全局锁来处理其他任务。