Concurrency 如何实施pop->;做点什么->;使用goroutines推送队列
我有一个队列,我想执行以下操作:Concurrency 如何实施pop->;做点什么->;使用goroutines推送队列,concurrency,go,queue,goroutine,Concurrency,Go,Queue,Goroutine,我有一个队列,我想执行以下操作: 弹出第一个元素 如果元件为偶数,则推动元件+1 这应该一直持续到队列为空;此外,我想同时使用多个goroutine 我可以为一个goroutine做些什么,但只要我添加一段时间,一切都会出错,因为似乎创建了太多goroutine。即使放置else{return}也不能解决问题。附带问题:为什么不呢?我得到了错误: syntax error: unexpected semicolon or newline before else syntax error: u
- 弹出第一个元素
- 如果元件为偶数,则推动元件+1
else{return}
也不能解决问题。附带问题:为什么不呢?我得到了错误:
syntax error: unexpected semicolon or newline before else
syntax error: unexpected }
var list=[]int{0,1,2,3}
var mutex=&sync.mutex{}
func pop(out-chan-int){
互斥锁
元素:=列表[0]
fmt.Println(“元素是”,元素)
列表=列表[1:]
mutex.Unlock()
outA(缓冲)通道是一个队列,而不是堆栈。因此,在该上下文中,推送和弹出没有意义
堆栈是后进先出(后进先出),就像旅行行李一样——你把你需要的东西放在最后。队列是先进先出(先进先出),就像你推大理石通过的管子
在队列的上下文中,您被称为入队和出队元素
考虑到所有这些,这就是我理解你想要做的:
- 创建一个缓冲通道(缓冲意味着它可以容纳许多元素,有效地使其成为一个队列)
- 然后用一堆随机数填充它
- 对其进行迭代,然后仅对偶数的对象再次排队,并向其添加1
尝试实现这个新算法。一个(缓冲)通道是一个队列,而不是一个堆栈。因此,在这种情况下,推送和弹出没有意义
堆栈是后进先出(后进先出),就像旅行行李一样——你把你需要的东西放在最后。队列是先进先出(先进先出),就像你推大理石通过的管子
在队列的上下文中,您被称为入队和出队元素
考虑到所有这些,这就是我理解你想要做的:
- 创建一个缓冲通道(缓冲意味着它可以容纳许多元素,有效地使其成为一个队列)
- 然后用一堆随机数填充它
- 对其进行迭代,然后仅对偶数的对象再次排队,并向其添加1
尝试实现此新算法。您的代码存在多个问题
else
始终与if
的右括号在同一行。请阅读此内容
time.Sleep
以time.Duration
为参数,单位为纳秒。如果要睡眠2秒,请使用time.Sleep(2*time.Second)
- 范围的
不需要推入
- 你的for
for
只是一次又一次地生成数百万个goroutines。goroutines是轻量级的,但不是免费的。添加某种同步机制来控制你正在运行的goroutines的数量
是一个稍好一点的版本。它可以工作,即使使用时间。睡眠作为同步机制是你永远不应该做的事情。你的代码有多个问题
else
始终与if
的右括号在同一行。请阅读此内容
time.Sleep
以time.Duration
为参数,单位为纳秒。如果要睡眠2秒,请使用time.Sleep(2*time.Second)
- 范围的
不需要推入
- 你的for
for
只是一次又一次地生成数百万个goroutines。goroutines是轻量级的,但不是免费的。添加某种同步机制来控制你正在运行的goroutines的数量
是一个稍好一点的版本。它可以工作,即使使用时间。睡眠作为同步机制是你永远不应该做的事情。附带问题的答案:你在返回后忘记了一个分号,而其他
必须与前面的}
在同一行。不需要分号,但正如@tomwide所说,else
必须在同一行后面。return
后面忘记了分号,else
必须与前面的}
在同一行。不需要分号,但正如@tomwide所说,else
必须在后面,在同一行中。那么基本上只是在for中添加一个非常小的等待时间,让一些例程在生成大量例程之前完成?您是否建议使用一个全局变量来跟踪有多少个例程?@meto Not wait time。明确的同步机制。我明白了,这会告诉你是否需要更多的社交活动。我想知道为什么你的例子没有问题。这是因为很短的等待时间让一些例程关闭,而不是不断地跨越新的例程吗?@meto基本上是的。你的代码创建goroutines的速度太快了,没有一个能真正完成任务。我的代码之所以有效,是因为它创建它们的速度比较慢,因此给了被创建的程序时间去做他们的事情。所以基本上只是在程序中增加了一个非常小的等待时间,让一些例程在生成大量的程序之前完成?您是否建议使用一个全局变量来跟踪有多少个例程?@meto Not wait time。明确的同步机制。我明白了,这会告诉你是否需要更多的社交活动。我想知道为什么你的例子没有问题。这是因为很短的等待时间让一些例程关闭,而不是不断地跨越新的例程吗?@meto基本上是的。你的代码创建goroutines的速度太快了,没有一个能真正完成任务。我的代码之所以能工作,是因为它创建它们的速度较慢,从而使创建的代码更容易运行
var list = []int{0, 1, 2, 3}
var mutex = &sync.Mutex{}
func pop(out chan int) {
mutex.Lock()
element := list[0]
fmt.Println("element is ", element)
list = list[1:]
mutex.Unlock()
out <- element
}
func push(in chan int) {
for element := range in {
if element%2 == 0 {
mutex.Lock()
list = append(list, element+1)
fmt.Println("New list is ", list)
mutex.Unlock()
}
}
}
func main() {
out := make(chan int)
fmt.Println("MAIN")
// for len(list) != 0 {
go pop(out)
go push(out)
//}
time.Sleep(2)
}