我有一个基于Haskell的网络服务,它执行的计算对于某些输入可能需要很长时间才能完成。(这里的“真长”是指超过一分钟)因为执行该计算会占用服务器上所有可用的CPU,所以当传入请求到达时,我将它们放入队列中(好吧,实际上是一个堆栈,原因与典型客户端有关,但这不是重点)在当前运行的计算完成时为它们提供服务。我的问题是客户端并不总是等待足够长的时间,有时会在他们端超时、断开连接并尝试使用不同的服务器(好吧,他们再次尝试并遇到了elb,通常会得到不同的实例).此外,有时Web客户端要求的计算会由于外部因素而变得过时,并且Web客户端将被终止。在那些情况下,我真的希望能够在我从堆栈中拉出下一个
在src/sync/rwmutex.go文件中,我们可以看到“Lock”的定义如下:func(rw*RWMutex)Lock(){ifrace.Enabled{_=rw.w.staterace.Disable()}//First,resolvecompetitionwithotherwriters.rw.w.Lock()//Announcetoreadersthereisapendingwriter.r:=atomic.AddInt32(&rw.readerCount,-rwmutexMaxReaders)+rwmutexMaxReaders//Waitforactivereaders
在src/sync/rwmutex.go文件中,我们可以看到“Lock”的定义如下:func(rw*RWMutex)Lock(){ifrace.Enabled{_=rw.w.staterace.Disable()}//First,resolvecompetitionwithotherwriters.rw.w.Lock()//Announcetoreadersthereisapendingwriter.r:=atomic.AddInt32(&rw.readerCount,-rwmutexMaxReaders)+rwmutexMaxReaders//Waitforactivereaders