Cover image

Go EP.8 Go Channel Select Multiple Communication Operations

17 Oct 2021

Share to:

สวัสดีครับ ในบทความนี้ก็เป็น EP.8 แล้วนะครับ โดยเนื้อหาจะเป็นเรื่องเกี่ยวกับ Channel Select Multiple Communication Operations

สําหรับท่านใดที่ยังไม่ได้อ่าน EP.7 ท่านสามารถกลับไปอ่านก่อนได้นะครับที่นี่ Go EP.7 Go Unit Testing

ในบทความก่อนหน้านี้เราได้เรียนรู้เรื่องการใช้งาน Go Channel กันไปแล้ว จะเห็นว่าถ้าเราต้องการส่งข้อมูลมากกว่า 1 Channel อาจจะทําเกิด blocking การทำงาน เมื่อ Channel ใด Channel หนึ่งไม่มีการรับส่งข้อมูล หรือไม่สามารถส่งข้อมูลได้อีก สิ่งที่จะมาช่วยให้โปรแกรมของเราทํางานต่อไปได้ก็คือ Select statement เรามาดูวิธีการใช้งานตามหัวข้อด้านล่างเลยครับ

Select statement

เราสามารถใช้ Select statement ในการ Select chennel ที่ส่งข้อมูลผ่าน Channel มาก่อน และจะไม่สนใจ Channel อื่นๆ หมายความว่า ถ้าเรามี Channel ทั้งหมด 3 ตัว ถ้า Channel ตัวใดตัวหนึ่งส่งข้อมูลมาก่อนก็จะรับข้อมูลจากตัวนั้นแล้วทํางานต่อไปตามที่เรากําหนด ส่วน Channel อื่นๆ ที่ยังไม่ส่งข้อมูลมา หรือส่งมาทีหลัง ระบบจะไม่สนใจ มาดูตัวอย่างกันดีกว่าครับ

package main

import (
	"fmt"
	"time"
)

func main() {

	c1 := make(chan string)
	c2 := make(chan string)

	go func() {
		time.Sleep(3 * time.Second)
		c1 <- "one"
	}()

	go func() {
		time.Sleep(1 * time.Second)
		c2 <- "two"
	}()


	for i := 0; i < 2; i++ {
		select {
		case msg1 := <-c1:
			fmt.Println("received", msg1)
		case msg2 := <-c2:
			fmt.Println("received", msg2)
		}
	}
}

// Result:

// received two
// received one

จาก Code ด้านบนจะเห็นว่าเรามี Channel สองตัวคือ c1 และ c2 ที่จะใช้เป็น Channel ในการส่งข้อมูลกลับจาก 2 function ที่ทํางานแบบ Parallel

ถ้าเราไม่ใช้ Select เพื่อรับข้อมูลจาก Channel ใด Channel หนึ่ง แล้วเราเขียน Code เพื่อรับข้อมูลจาก c1 ก่อน หมายความว่าถ้า c1 ไม่ส่งข้อมูลมา โปรแกรมของเราจะไปต่อไม่ได้เลย

แต่ถ้าเราใช้ Select เข้ามาช่วยตามตัวอย่างด้านบน ในแต่ละครั้งของการ Loop โปรแกรมจะรอรับค่าของทั้ง c1 และ c2 ถ้า Channel ใดส่งข้อมูลมาก่อนก็จะไปทําใน case นั้นทันที และจะทํางานอื่นๆต่อไปได้เลย

ตามผลลัพธ์ที่ได้ จะเห็นว่าใน Loop แรก แสดง “received two” ก่อน เนื่องจากใน Function ส่งค่า “two” ผ่าน c2 กลับมาก่อน (Sleep แค่ 1 วินาที) ส่วนใน Loop ที่สอง จะไปรอรับค่าของ c1 และ c2 อีกครั้ง แต่เนื่องจาก c2 ถูกส่งข้อมูลกลับมาแล้วใน Loop แรก และในเวลาต่อมาก็มีการส่งค่ากลับมาจาก c1 (ครบกําหนด Sleep 3 วินาที) จึงทําให้แสดงผล “received one” ออกมา

ประมาณนี้ครับ สําหรับการเลือกรับข้อมูลจากหลายๆ Channel

ใน EP.9 จะเป็นเรื่องเกี่ยวกับ Go Context ท่านสามารถกดเข้าไปอ่านต่อกันได้ครับ

สําหรับบทความนี้ก็ขอจบไว้เพียงเท่านี้ครับ ขอบคุณครับ

Suggestion blogs

Disable service worker ใน React

Service Worker คือ JavaScript ทำงานบนเว็บเบราเซอร์ ซึ่งจะทำงานอยู่เบื้องหลังแยกออกจากตัวเว็บโดยตัว Service Worker นิยมใช้ทำ Offline mode ที่เราพบเห็นจากเว็บส่วนใหญ่ของ Google รวมถึงการเพื่อทำ Web Push Notification และจะมีความสามารถอื่นๆ เพิ่มเข้ามาในอนาคต และ Service Worker สามารถดัก Network Request ของเว็บ เช่น HTTP Request, โหลดรูป หรือ API Call โดยทุก Request ที่ออกจากเว็บเราจะผ่าน Service worker ทั้งหมดทำให้เราสามารถจัดการ Network Request ได้ดีขึ้น เช่น การคืนค่าจาก Cache แทนที่จะส่ง Request นั้นออกไปจริงๆ หรือในกรณีที่ไม่สามารถเชื่อมต่ออินเตอร์เน็ตได้

สร้าง Docker Image

สวัสดีครับ ในบทความก่อนหน้านี้ผมได้อธิบายว่า docker คืออะไร และ วิธีติดตั้ง Docker engine ไปแล้ว ถ้าใครยังไม่ได้อ่านก็กลับไปอ่านก่อนนะครับ ในบทความนี้จะเกี่ยวข้องกับการสร้าง Docker Image ก่อนอื่นมาทําความเข้าใจอีกซักนิดเกี่ยวกับ Docker Image กันก่อน

การเขียนโปรแกรม ตรวจสอบ เลขคู่ เลขคี่

การเขียนโปรแกรม ตรวจสอบ เลขคู่ เลขคี่สําหรับการเขียนโปรแกรม เชคว่าเลขใดๆ เป็นเลขคู่หรือเลขคี่นั้น สามารถเขียนได้หลายวิธี ในบทความนี้ผมจะยกตัวอย่างการเขียนอีกแบบนึง โดยตัวอย่างนี้ผมจะเขียนเป็นภาษา javascript ดังนี้


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

Build with ❤️ and Astro.

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