问题描述
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提供了一种用于创建更细粒度的锁定的机制,以帮助释放更多的全局锁来处理其他任务。