我有一个整数片,它们是同时操作的:
ints := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
我使用缓冲通道作为信号灯,以使并发运行go例程的上限:
sem := make(chan struct{}, 2)
for _, i := range ints {
// acquire semaphore
sem <- struct{}{}
// start long running go routine
go func(id int, sem chan struct{}) {
// do something
// release semaphore
<- sem
}(i, sem)
}
上面的代码在到达最后两个整数或最后两个整数之前都可以很好地工作,因为程序在这些最后执行例程完成之前就结束了。
问题 :如何等待缓冲的通道耗尽?
您不能以这种方式使用信号灯(在这种情况下为通道)。不能保证在处理值和调度更多goroutine时,它永远不会为空。在这种情况下,这尤其不重要,因为您正在同步调度工作,但是由于没有检查通道长度的无竞争方法,因此没有等待通道长度达到0的原语。
使用a sync.WaitGroup
等待所有goroutine完成
sem := make(chan struct{}, 2)
var wg sync.WaitGroup
for _, i := range ints {
wg.Add(1)
// acquire semaphore
sem <- struct{}{}
// start long running go routine
go func(id int) {
defer wg.Done()
// do something
// release semaphore
<-sem
}(i)
}
wg.Wait()
问题内容: 在本文中了解了我最初的问题的(正确)解决方案之后,了解了golang频道:死锁,我想出了一个略有不同的解决方案(在我看来,这更好看: 它确实可以工作,但是不幸的是,它在比赛中运行,它显示了2个比赛条件: 您能帮我了解比赛情况吗? 问题答案: 您正在试图从读中未同步到够程变异它的写入。您可以添加锁以同步写入和读取。 例如 请注意,您也可以使用。 您可以做的另一件事是等待goroutine
有几个消费者线程在等待由单个生产者线程提供的异步到达的数据的信号量。如果消费者已经获取了信号量,生产者如何获取信号量来通知他们呢?在这里,它被阻塞了,不能执行notifyAll() 当然,删除“synchronized”会导致 同样,生产者线程被阻塞,无法获取信号量来通知消费者。 更新:我应该提到,这在第二次数据准备就绪时失败。第一次数据准备就绪时,生产者没有阻塞。下一次产生数据时,生产者阻塞了。
默认情况下,通道是不带缓冲区的。 发送端发送数据,同时必须又接收端相应的接收数据。 而带缓冲区的通道则允许发送端的数据发送和接收端的数据获取处于异步状态,就是说发送端发送的数据可以放在缓冲区里面,可以等待接收端去获取数据,而不是立刻需要接收端去获取数据。 不过由于缓冲区的大小是有限的,所以还是必须有接收端来接收数据的,否则缓冲区一满,数据发送端就无法再发送数据了。 package main imp
问题内容: 我正在开发Chrome中的扩展程序,但我想知道:找出元素何时存在的最佳方法是什么?使用纯JavaScript,间隔检查直到元素存在,或者jQuery是否有一些简单的方法来执行此操作? 问题答案: 由于性能问题,不建议将其与其他DOM突变事件一起弃用- 推荐的方法是使用MutationObserver来监视DOM。不过,只有新的浏览器才支持此功能,因此您应该在不可用时退回。
问题内容: 量角器在尝试单击按钮时失败。最初,按钮将处于禁用状态(一段时间后将被启用),量角器认为按钮已准备就绪,单击按钮后失败。 所以我希望量角器脚本要等到按钮启用。我在下面尝试过,但是没有用。有人可以发布完整的代码来等待该元素被启用吗? 问题答案: 有一个非常合适的Expected Condition– 它会等待某个元素同时 可见和启用 :
我们有一个限制实现,基本上可以归结为: 我想收集关于信号量对方法的整体响应时间的影响的指标。例如,我想知道等待获取的线程数量,等待的时间等等。我想,我正在寻找的是一种也能捕捉时间信息的量规。 如何测量Semphore统计数据?