2017-05-05 19 views
0

我在想我的结果顺序应该与输入相同,是否有可能在进行例行公事?可以在输入顺序中收集goroutine结果吗?

我实现这样的:

package main 

import "fmt" 
import "time" 

func worker(id int, jobs <-chan int, results chan<- int) { 
    for j := range jobs { 
    time.Sleep(time.Second) 
    results <- j * 2 
    } 
} 

func main() { 
    jobs := make(chan int, 100) 
    results := make(chan int, 100) 

    for w := 1; w <= 3; w++ { 
    go worker(w, jobs, results) 
    } 

    for j := 1; j <= 5; j++ { 
    jobs <- j 
    } 
    close(jobs) 

    // Finally we collect all the results of the work. 
    // But somehow I want to keep the order 
    for a := 1; a <= 5; a++ { 
    fmt.Println(<-results) // actually, I want to make it 2, 4, 6, 8, 10 
    } 
} 

来看,它here

+1

为什么你实现并发代码,如果你需要它实际上是串行? – zerkms

+1

如何为每个作业附加序列号,排序它们,然后在所有并发代码完成时对它们进行排序? – Vervious

回答

-2

必须保持成果以便在工人FUNC。 goroutine运行没有命令。设定结果必须保持顺序。

package main 

import "fmt" 
import "time" 
import "sync/atomic" 

var pivot uint32 = 1 

func worker(id int, jobs <-chan int, results chan<- int) { 
    for j := range jobs { 
     time.Sleep(time.Second) 

     for { 
      if n := atomic.LoadUint32(&pivot); int(n) == j { 
       results <- j * 2 
       atomic.AddUint32(&pivot, 1) 
       break 
      } 
      time.Sleep(time.Millisecond) 
     } 
    } 
} 

func main() { 
    jobs := make(chan int, 100) 
    results := make(chan int, 100) 

    for w := 1; w <= 3; w++ { 
     go worker(w, jobs, results) 
    } 

    for j := 1; j <= 5; j++ { 
     jobs <- j 
    } 
    close(jobs) 

    // Finally we collect all the results of the work. 
    // But somehow I want to keep the order 
    for a := 1; a <= 5; a++ { 
     fmt.Println(<-results) // actually, I want to make it 2, 4, 6, 8, 10 
    } 
} 

运行它here

相关问题