2017-10-04 20 views
0

私のコードでは、すべてのタスクを実行する前にコードが実行されます。何を終了する前にすべてのタスクを行うように私のコードで変更する必要がありますか?コードの早期終了

package main 

import (
"fmt" 
"math/rand" 
"time" 
) 

// run x tasks at random intervals 
// - a task is a goroutine that runs for 2 seconds. 
// - a task runs concurrently to other task 
// - the interval between task is between 0 and 2 seconds 

func main() { 
// set x to the number of tasks 
x := 4 
// random numbers generation initialization 
random := rand.New(rand.NewSource(1234)) 

for num := 0; num < x; num++ { 
    // sleep for a random amount of milliseconds    before starting a new task 
    duration := time.Millisecond *     time.Duration(random.Intn(2000)) 
    time.Sleep(duration) 

    // run a task 
    go func() { 
     // this is the work, expressed by sleeping for 2   seconds 
     time.Sleep(2 * time.Second) 
     fmt.Println("task done") 
    }() 
} 
} 
+0

https://play.golang.org/p/fcb8ijB7qj –

+1

[チュートリアル](https://tour.golang.org)から[良い本](https://github.com/golang/)から始めてください。 go/wiki/Books)を参照してください。私はGoを学ぶつもりでありがたく思っていますが、まずあなたの頭の中にある基本的な基礎を得るべきです。 – kostix

答えて

0

多くのオプションがあります。たとえば、チャンネルを使用することができます。sync.WaitGroup

1

はい@Laneyは、これはWaitグループとチャンネルの両方を使用して行うことができます。以下のコードを参照してください。

Waitgroups:

package main 

import (
    "fmt" 
    "math/rand" 
    "sync" 
    "time" 
) 

// run x tasks at random intervals 
// - a task is a goroutine that runs for 2 seconds. 
// - a task runs concurrently to other task 
// - the interval between task is between 0 and 2 seconds 

func main() { 
    // set x to the number of tasks 
    x := 4 
    // random numbers generation initialization 
    var wg sync.WaitGroup 
    random := rand.New(rand.NewSource(1234)) 

    for num := 0; num < x; num++ { 
     // sleep for a random amount of milliseconds    before starting a new task 
     duration := time.Millisecond * time.Duration(random.Intn(2000)) 
     time.Sleep(duration) 
     // 
     wg.Add(1) 
     // run a task 
     go func() { 
      // this is the work, expressed by sleeping for 2 seconds 
      time.Sleep(2 * time.Second) 
      fmt.Println("task done") 
      wg.Done() 
     }() 
    } 
    wg.Wait() 
    fmt.Println("All tasks done") 
} 

出力:遊び場で

task done 
task done 
task done 
task done 
All tasks done 

https://play.golang.org/p/V-olyX9Qm8

チャンネルを使用:

package main 

import (
    "fmt" 
    "math/rand" 
    "time" 
) 

// run x tasks at random intervals 
// - a task is a goroutine that runs for 2 seconds. 
// - a task runs concurrently to other task 
// - the interval between task is between 0 and 2 seconds 

func main() { 
    //Channel to indicate completion of a task, can be helpful in sending a result value also 
    results := make(chan int) 
    // set x to the number of tasks 
    x := 4 
    t := 0 //task tracker 
    // random numbers generation initialization 
    random := rand.New(rand.NewSource(1234)) 

    for num := 0; num < x; num++ { 
     // sleep for a random amount of milliseconds    before starting a new task 
     duration := time.Millisecond * time.Duration(random.Intn(2000)) 
     time.Sleep(duration) 
     // 

     // run a task 
     go func() { 
      // this is the work, expressed by sleeping for 2 seconds 
      time.Sleep(2 * time.Second) 
      fmt.Println("task done") 
      results <- 1 //may be something possibly relevant to the task 

     }() 
    } 
    //Iterate over the channel till the number of tasks 
    for result := range results { 
     fmt.Println("Got result", result) 
     t++ 
     if t == x { 
      close(results) 
     } 
    } 
    fmt.Println("All tasks done") 
} 

出力:

task done 
task done 
Got result 1 
Got result 1 
task done 
Got result 1 
task done 
Got result 1 
All tasks done 

遊び場:メインゴルーチンが終了したときにhttps://play.golang.org/p/yAFdDj5nhb

0

プログラムは終了します。あなたは使用することができ :

  • waitgroupを - それは、すべてのタスクが完了したときに
  • チャンネルを待つために非常に便利な方法を提供します - チャネルから読み取る新しいデータが到着するまでブロックされているか、チャネルが閉じられます。
  • ナイーブ睡眠 - ゴーで良いだけ例えば目的
1

、ほとんどの言語として、プロセスは、ときエントリポイントmain()関数が終了終了します。

多くのゴルーチンが生成されているので、メイン関数はゴルーチンがすべて終了する前に終了し、プロセスを終了させ、それらのゴルーチンを終了させません。

他の人が示唆したように、あなたはすべてのゴルーチンが完了するまで、あなたのmain()機能をブロックしたい、とのいずれかセマフォ(sync.WaitGroup)を使用して、またはチャネルされている行うための最も一般的な方法のカップル(go by example

関連する問題