- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个离散模拟,其中来自多个线程的请求值累积在一个集中队列中。每 n 毫秒,管理器就会醒来处理请求。当管理器醒来时,它应该在一个单独的步骤中检索中央队列的所有内容。在处理这些时,任何尝试提交到队列的客户端线程都应该阻塞。处理完成后,队列重新打开,管理器返回 sleep 状态。
最好的方法是什么? STM 的重试行为并不是我真正想要的。如果我使用 Chan 或 MVar,则无法阻止客户端在处理过程中将其他请求排队。一种方法是使用 MVar 作为持有队列的 Chan 上的互斥体。还有其他方法可以做到这一点吗?
最佳答案
我必须根据您预期的争用级别进行基准测试才能确切地知道最佳解决方案是什么,但这是我的猜测。
无论您的项目类型是什么,都使用包含[Item]
的MVar
。使用 newMVar []
初始化 MVar
。要将元素添加到中央列表,请使用 modifyMVar_ (return . (item :))
,其中 item
是您要添加到列表中的内容。在处理过程开始时使用 takeMVar
,并在处理过程结束时使用 putMVar []
。
首先,请注意,这在内部不是一个队列。如果您想按照添加顺序处理内容,请在提取列表后反转
列表。
其次,只要这些是您在 MVar
上执行的唯一操作,就不会出现竞争条件。这是因为 MVar
已完全初始化,并且每个操作都是“取出 MVar
的内容,放入其他内容”。在等待后半部分时,操作可能会阻塞,但这不会死锁,并且不会丢失更新。
关于haskell - 通过单个离散步骤删除 Chan 或 MVar 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4567750/
Golang 新手在这里。 两者在功能上有区别吗 func randomNumberGenerator() <-chan int { 和 func randomNumberGenerator() ch
我想从一个函数返回一个 []<-chan int 给定的 []chan int,但即使转换也不起作用。 你 可以将 分配给 chan T 或 chan<- T (隐式类型转换)。我不知道为什么你 不能
在golang中,当我们需要等待某事完成时,我们会使用一个channel。 例子: done := make(chan struct{}) go func() { // ... clo
我正在实现一个简单的工作池算法,其中 1 个 Sender(调度程序)将作业发送到 M(Worker)go 例程。为此,它使用一个 channel 的 channel 来为第一个空闲的工作人员分配一个
这是我收到的错误消息: cannot use c.ReceiverChans (type []chan *Message) as type []chan interface {} in functio
package main import "fmt" func x(foo []string, cz chan string) { for i := range foo { cz
刚接触golang,开始写一些基于prometheus client-go的monitor exporter,发现promethues的源码中有这样定义channel var的代码 reloadCh
今天我在学习 channels 和 goroutine of go。我遇到了一些让我困惑的现象。 我的 go 文件如下所示: package main import ( "fmt" ) fun
有如下代码: func consumeQueue(ch *amqp.Channel, q_Name string) (chan amqp.Delivery) { msgs, err := ch
我的问题来自尝试读取 channel ,如果可以的话,或者写它,如果可以的话,使用 select声明。 我知道像 make(chan bool, 1) 这样指定的 channel 被缓冲了,我的部分问
遇到golang channel 的一个问题:发现go 协程读取channel 数据 并没有按照预期进行协作执行。 经过查资料: 使用channel 操作不当导致,channel分 有
我认为它们是一样的,但是The go memory model中有一个这样的词:, 如果 channel 被缓冲(例如,c = make(chan int, 1))那么程序将不能保证打印“hello,
我知道如果有多个“通信”可以在 select 中进行。声明一个是随机选择的。我正在尝试找到一种替代方法,它可以更喜欢一种“交流”而不是另一种。 背景是我正在使用上下文杀死的 channel 上的 go
我想维护一个 channel 集合,并且能够添加和删除 channel 。是否定义了相等性,以便我可以正确地 conj 和 disj ? 换句话说,这总是有效吗? => (def chan-colle
一段时间以来,我一直在尝试理解 Go 中的 channel 。但有一件事让我感到奇怪。当你打电话时究竟发生了什么, for { select { case <-chan: } } 它是
是否可以让函数 funcWithNonChanResult 具有以下接口(interface): func funcWithNonChanResult() int { 如果我想让它在接口(interf
我有一个功能: func f(input interface{}) interface{} { t := reflect.ChanOf(reflect.BothDir, ) c :=
我正在编写一个 python 脚本,我正在尝试获取相机 .chan 光圈值 - 水平和垂直,因为我将使用这些值并将其传输到 Maya 相机中。 但是,即使我打开 .chan,我也只看到几行/列/行或属
我正在尝试调用 name.com API(并且成功了,除了一次调用......当我尝试调用他们的 Search() 方法时,我收到错误。 这是我的代码: func TestExecute() stri
我想了解为什么这种情况会陷入僵局,而另一种情况却不会。 如果我在 goroutine 中关闭 channel ,它工作正常,但如果我在 WaitGroup.Wait() 之后关闭它会导致死锁。 pac
我是一名优秀的程序员,十分优秀!