Go EP.5 Go Routine

5 Sep 2021,
Share: 
Cover image

สวัสดีครับ ในบทความนี้ก็เป็น EP.5 แล้วนะครับ โดยเนื้อหาจะเป็นเรื่องเกี่ยวกับ Go Routine ซึ่งเป็นเรื่องสําคัญมากในการพัฒนาโปรแกรมด้วยภาษา Go เพราะจะช่วยให้เราสามารถพัฒนาโปรแกรมที่มี Performance ที่ดีครับ

สําหรับท่านใดที่ยังไม่ได้อ่าน EP.4 ท่านสามารถกลับไปอ่านก่อนได้นะครับที่นี่ Go EP.4 Syntax ของภาษา Go

มาเริ่มเรียนรู้ไปด้วยกันตามหัวข้อด้านล่างเลยครับ

Go Routine คืออะไร

โดยปกติเมื่อเราเขียนโปรแกรมภาษา Go ตัวโปรแกรมจะ Run Code ไปทีละบรรทัดจากบนลงล่าง ซึ่งจะใช้ CPU เพียง 1 Core เท่านั้น ตามตัวอย่างนี้ครับ

package main

import (
	"fmt"
	"time"
)

func main() {
	start := time.Now()

	task1()
	task2()
	task3()

	fmt.Println("ใช้เวลาในการ Run ทั้งสิ้น : ", time.Since(start))
}

func task1(){
	time.Sleep(3 * time.Second)
	fmt.Println("Task1 success")
}

func task2(){
	time.Sleep(5 * time.Second)
	fmt.Println("Task2 success")
}

func task3(){
	time.Sleep(3 * time.Second)
	fmt.Println("Task3 success")
}

// ผลลัพธ์จากการ Run

// Task1 success
// Task2 success
// Task3 success
// ใช้เวลาในการ Run ทั้งสิ้น :  11s

จะเห็นว่าในแต่ละ Task จะทํางานไปตามลําดับ ทําให้เวลารวมของการทํางานในโปรแกรมนี้คือ 9 วินาที

แต่การใช้ Go Routine คือการเขียน Code ให้สามารถทํางานหลายๆอย่างในเวลาเดียวกัน หรือสามารถ Run งานด้วย CPU 2 Core นั่นเอง หมายความว่าโปรแกรมที่เราเขียนจะมีประสิทธิภาพมากขึ้น

มาดูวิธีการใช้งานตามหัวข้อถัดไปได้เลยครับ

Go Routine ใช้งานยังไร

การใช้งาน Go Routine คือเราสามารถใส่ keyword “go” ไว้หน้า Function ที่เราต้องการจะให้แยก Thread ออกไปทํางาน function นั้นจะแยก Thread ออกไปทํางานทันที ลองดูตามตัวอย่างนี้ครับ

package main

import (
	"fmt"
	"time"
)

func main() {
	start := time.Now()

	task1()
	go task2()
	task3()

	fmt.Println("ใช้เวลาในการ Run ทั้งสิ้น : ", time.Since(start))
}

func task1(){
	time.Sleep(3 * time.Second)
	fmt.Println("Task1 success")
}

func task2(){
	time.Sleep(5 * time.Second)
	fmt.Println("Task2 success")
}

func task3(){
	time.Sleep(3 * time.Second)
	fmt.Println("Task3 success")
}

// ผลลัพธ์จากการ Run

// Task1 success
// Task3 success
// ใช้เวลาในการ Run ทั้งสิ้น :  6s

จากตัวอย่างด้านบนจะเห็นว่า Task2 หายไป เนื่องจาก Task2 แยก Thread ออกไปทํางานแต่ยังทํางานไม่เสร็จ แต่ Main thread ทํางานจบก่อนทําให้โปรแกรมจบการทํางาน Task2 จึงไม่ถูกทํางานต่อจนจบ

เรามาลองเปลี่ยนใหม่โดยเพิ่ม Sleep ก่อนที่จะจบโปรแกรมเพื่อรอให้ Task2 ทํางานเสร็จก่อน ตามนี้ครับ

package main

import (
	"fmt"
	"time"
)

func main() {
	start := time.Now()

	task1()
	go task2()
	task3()

	allTime := time.Since(start) // วัดเวลาการทํางานเฉพาะ Task1, Task2, Task3 เท่านั้น

	time.Sleep(5 * time.Second)

	fmt.Println("ใช้เวลาในการ Run ทั้งสิ้น : ", allTime)
}

func task1(){
	time.Sleep(3 * time.Second)
	fmt.Println("Task1 success")
}

func task2(){
	time.Sleep(5 * time.Second)
	fmt.Println("Task2 success")
}

func task3(){
	time.Sleep(3 * time.Second)
	fmt.Println("Task3 success")
}

// Task1 success
// Task3 success
// Task2 success
// ใช้เวลาในการ Run ทั้งสิ้น :  6s

จะเห็นว่าเราได้เพิ่ม “time.Sleep(5 * time.Second)” เพื่อรอ 5 วินาที ทําให้ Task2 สามารถทํางานได้จนเสร็จ และที่สําคัญ เวลาในการทํางานของ Task1, Task2, Task3 รวมกันลดลงจาก 11s เหลือ 6s

สําหรับในการใช้งานจริงเราจะไม่ใช้ Sleep เพื่อรอแบบนี้นะครับ เราจะใช้สิ่งที่เรียกว่า Channel ซึ่งเป็นเรื่องสําคัญในการใช้งานร่วมกับ Go Routine

ขอให้สนุกกับการเขียน Code นะครับ ขอบคุณครับ

สําหรับ EP. ต่อไปจะเป็นเรื่อง Go EP.6 Go Channel เข้าไปอ่านต่อได้เลยครับ

Suggestion blogs

วิธี update extension chrome

สวัสดีครับ วันนี้ผมจะสอนวิธีการ update extension ของ chrome กันครับ โดยปกติแล้ว ระบบ extension ของ chrome จะ update ให้เราโดยอัตโนมัติอยุ่แล้ว แต่ถ้าเราใจร้อนก็สามารถ update ด้วยตัวเองได้ โดยมีวิธีดังนี้ ให้ลบ extension ออกแล้ว ติดตั้งใหม่ ผมจะแบ่งเป็นสองขั้นตอนคือ ลบ extension และ ติดตั้ง extension

Go EP.12 Recover ในภาษา Go

สวัสดีครับ ในบทความนี้ก็เป็น EP.12 แล้วนะครับ โดยเนื้อหาจะเป็นเรื่องเกี่ยวกับ Recover ในภาษา Go ซึ่งจะเป็นเนื้อหาที่ต่อเนื่องมาจาก Go EP.11 Panic ในภาษา Go ครับสําหรับท่านใดที่ยังไม่ได้อ่าน EP.11 ท่านสามารถกลับไปอ่านก่อนได้นะครับที่นี่ Go EP.11 Panic ในภาษา Goมาเริ่มเรียนรู้ไปด้วยกันตามหัวข้อด้านล่างเลยครับ

วิธีการ ซื้อ-จองล่วงหน้า ลอตเตอรี่ให้ได้

หลังจากที่มีโครงการซื้อ-จองล่วงหน้าสลากกินแบ่งรัฐบาลเป็นรูปแบบการจัดสรรสลากกินแบ่งรัฐบาล ที่เปิดให้ซื้อ-จองผ่านช่องทางต่าง ๆ ของ ธนาคารกรุงไทย โดยการจองซื้อสลากสามารถทำได้ ทำได้ 3 ช่องทาง ช่องทางแรกคือไปพบพนักงานที่ธนาคารกรุงไทยเลย  ช่องทางที่สองคือผ่านเครื่อง ATM ของธนาคารกรุงไทย ซึ่งมี ATM ที่รองรับ 9000 เครื่องทั่วประเทศ และช่องทางที่สามคือ internet banking เมื่อเกิดโครงการนี้ขึ้นมา ปัญหาที่เกิดขึ้นคือ มีคนจํานวนไม่น้อยที่ไม่สามารถจองหรือซื้อสลากกินแบ่งรัฐบาลได้ เนื่องจากมีคนเข้าทํารายการจองหรือซื้อสลากกินแบ่งรัฐบาลเป็นจํานวนมาก (ช่วงแรกระบบถึงกับล่มเลยทีเดียว)


Copyright © 2019 - 2025 thiti.dev |  v1.58.0 |  Privacy policy | 

Build with ❤️ and Astro.

Github profile   Linkedin profile   Instagram   X profile   Nostr   Youtube channel   Telegram   Email contact   วงแหวนเว็บ