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

这应该一直持续到队列为空;此外,我想同时使用多个goroutine

我可以为一个goroutine做些什么,但只要我添加一段时间,一切都会出错,因为似乎创建了太多goroutine。即使放置
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)
}