Home | Back


การทดลองใช้ Goroutine และ Channel ใน Golang

Sunday, 29 November 2015



วันนี้ผมได้ทดลองเกี่ยวกับความสามารถด้าน Concurrency ในภาษา Golang ที่ออกแบบการทำงานในลักษณะคล้าย ๆ Thread แต่มีความง่ายและเบากว่า Thread ปกติ ที่เรียกว่า Goroutine และมีการสื่อสารกันผ่านสิ่งที่เรียกว่า Channel ผมเลยตั้งโจทย์ให้สร้าง Goroutine ขึ้นมาซัก 10 Goroutine ให้ผลิตข้อมูลตัวเลข 0 - 999 แบบสุ่ม แล้วส่งให้โปรแกรมหลักนำมาแสดงผล ซึ่ง code โปรแกรมมีดังนี้ครับ

File : test.go

package main

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

type pack struct {
 n int
 data int
}

func init() {
 rand.Seed(time.Now().Unix())
}

func p(n int,c chan *pack) {
 for {
  data := new(pack)
  data.n = n
  data.data = rand.Intn(1000)
  c <- data
  time.Sleep(time.Duration(rand.Intn(3000)) * time.Millisecond)
 }
}

func main() {
 c := make(chan *pack)
 i := 0

 for i < 10 {
  go p(i,c)
  i++
 }

 for {
  data := <- c
  fmt.Printf("%d - %03d\n",data.n, data.data)
 }
}

หลังจาก compile แล้วผลเป็นอย่างไร ก็ไปทดลองกันเอาเองนะครับ อิอิอิอิ



Home | Back