Grow with AppMaster Grow with AppMaster.
Become our partner arrow ico

โกรูทีน

โกรูทีน

หนึ่งในแง่มุมที่ได้รับความนิยมมากที่สุดของภาษาโปรแกรม Go คือการสนับสนุนระดับเฟิร์สคลาสสำหรับความสามารถของคอมพิวเตอร์ในการทำงานหลายอย่างพร้อมกัน ความสามารถในการรันโค้ดพร้อมกันมีความสำคัญมากขึ้นในการเขียนโปรแกรม เนื่องจากคอมพิวเตอร์เปลี่ยนจากการรันโค้ดแบบไหลเดียวเร็วขึ้นเป็นการรันหลายสตรีมพร้อมกัน ในการ ทำให้โปรแกรม ทำงานเร็วขึ้น โปรแกรมเมอร์ต้องออกแบบให้โปรแกรมทำงานพร้อมกัน เพื่อให้แต่ละองค์ประกอบที่ทำงานพร้อมกันของระบบสามารถทำงานได้อย่างอิสระจากองค์ประกอบอื่นๆ

ฟังก์ชัน Two Go, Goroutines และช่องทำให้การทำงานพร้อมกันง่ายขึ้นเมื่อใช้งานร่วมกัน Goroutines เสนอประเภทเบื้องต้นพื้นฐานสำหรับความสามารถนี้ Goroutines มีราคาไม่แพงในแง่ของพื้นที่หน่วยความจำ การโต้ตอบระหว่างเธรด และการเชื่อมต่อเครือข่าย นอกจากนี้ยังมีเวลาเริ่มต้นที่ดีกว่าเธรดซึ่งรองรับภาษาโปรแกรมหลายภาษา โดยพื้นฐานแล้ว Go หมายถึง Goroutines ตามที่ Java และภาษาการเขียนโปรแกรมอื่นเรียกว่าเธรด

Goroutines คืออะไร ?

goroutine เป็นเธรดการใช้งานอย่างง่ายใน Golang ที่ทำงานพร้อมกันกับส่วนที่เหลือของโปรแกรม Goroutines มีราคาไม่แพงเมื่อมีลักษณะคล้ายกับเธรดมาตรฐานเนื่องจากต้นทุนในการสร้าง goroutine นั้นต่ำมาก ดังนั้นจึงมีการใช้กันอย่างแพร่หลายใน Go สำหรับการเขียนโปรแกรมพร้อมกัน ทุกโปรแกรมประกอบด้วยอย่างน้อยหนึ่ง goroutine เดียวที่เรียกว่า goroutine หลัก โกรูทีนหลักจะควบคุมโกรูทีนอื่นๆ ทั้งหมด ดังนั้น หาก goroutine หลักสิ้นสุดลง goroutine อื่นๆ ทั้งหมดในสคริปต์ก็จะทำเช่นกัน Goroutine ทำงานในพื้นหลังเสมอ

ตัวอย่าง: นี่คือภาพประกอบ: คุณกำลังเขียนบางอย่างในสมุดบันทึกและรู้สึกหิว คุณจะหยุดพักและหาอาหาร แล้วเริ่มเขียนใหม่ ตอนนี้คุณกำลังทำสองบทบาท (เขียนและกิน) ตามกรอบเวลาที่ถือเป็นการจ้างงานพร้อมกัน ควรเน้นย้ำว่างานทั้งสองนี้ (การเขียนและการกิน) ยังคงต้องทำควบคู่กันไป เมื่อทำเสร็จพร้อมกัน จะเรียกว่าขนานกัน การทำงานพร้อมกันรวมถึงการโต้ตอบกับหลายสิ่งพร้อมกัน Parallelism (การแสดงหลายอย่างพร้อมกัน) เป็นคลาสย่อยของคลาสนี้ (ไม่จำเป็นต้องทำพร้อมกัน) โดยมีตารางเวลาบางส่วน

เราสามารถเพิ่ม goroutine ได้โดยใช้คีย์เวิร์ด go ในการเรียกใช้ฟังก์ชัน เมื่อเราใช้คีย์เวิร์ด go กับ function call เราจะตั้งค่าการทำงานพร้อมกันให้เป็นประสิทธิภาพ แต่ก่อนอื่น เรามาระบุผลกระทบของการใช้คำหลัก go กับการดำเนินการกันก่อน ลองพิจารณาว่ามี goroutine สองรายการในโปรแกรม ข้อความ " package main import " จะเป็นรายการของโปรแกรม ใน Go การนำเข้าหลักของแพ็คเกจคือคำสั่งการนำเข้าที่สำแดง goroutine หลัก ( goroutine first goroutine) เป็นนัย เมื่อเราดำเนินการ go ( f) goroutine ที่สองจะถูกสร้างขึ้น (0) โดยปกติแล้ว ซอฟต์แวร์ของเราจะดำเนินการทุกคำสั่งในฟังก์ชันหลักเมื่อเราเรียกใช้ฟังก์ชันก่อนที่จะไปยังบรรทัดถัดไป

เราสามารถดำเนินการตามขั้นตอนได้อย่างรวดเร็วด้วย goroutine ก่อนที่จะไปยังขั้นตอนต่อไป เป็นผลให้มีการเพิ่มวิธีการ scanln; มิฉะนั้นรหัสจะสิ้นสุดก่อนที่จะแสดงตัวเลขทั้งหมด Goroutines นั้นง่ายต่อการสร้างและอาจสร้างเป็นจำนวนมาก คุณจะสังเกตได้ว่าเมื่อซอฟต์แวร์นี้ทำงาน goroutines จะทำงานตามลำดับแทนที่จะทำงานพร้อมกัน

normal vs goroutine

ข้อดีของ Goroutines เหนือเธรด

Goroutines มีค่าใช้จ่ายเพียงเล็กน้อย

Goroutines มีราคาถูกกว่ากระบวนการอื่นๆ ขนาดมวลเพียงไม่กี่กิโลไบต์ และสามารถขยายหรือย่อขนาดเพื่อตอบสนองความต้องการของโปรแกรม ตรงข้ามกับเธรด ซึ่งขนาดสแต็กต้องกำหนดและเป็นแบบถาวร

มี Goroutines มัลติเพล็กซ์

มีเธรดของระบบปฏิบัติการน้อยมากที่จะมัลติเพล็กซ์ ในโปรแกรมที่มี goroutine หลายร้อยรายการ อาจมีเพียงหนึ่งกระบวนการเท่านั้น goroutines ที่เหลือจะถูกถ่ายโอนไปยังกระบวนการของระบบปฏิบัติการใหม่ สมมติว่า goroutine ใดๆ ในกระบวนการนั้นค้าง ตัวอย่างเช่น เมื่อร้องขอการแทรกแซงจากผู้ใช้ รันไทม์จะจัดการแต่ละสิ่งเหล่านี้ และนักพัฒนาของเราจะได้รับ API ที่ชัดเจนเพื่อจัดการพร้อมกันในขณะที่ป้องกันจากความซับซ้อนเล็กน้อยเหล่านี้

Goroutines สื่อสารโดยใช้ช่องสัญญาณ

Goroutines สนทนาโดยใช้ช่องสัญญาณ มีจุดประสงค์เพื่อป้องกันไม่ให้สถานการณ์การแข่งขันเกิดขึ้นเมื่อพวกเขาแบ่งปันหน่วยความจำที่เกี่ยวข้อง ช่องอาจเปรียบได้กับท่อที่ goroutines ใช้ในการโต้ตอบ

ช่องทางคืออะไร?

goroutines สองตัวสามารถโต้ตอบซึ่งกันและกันและประสานงานการทำงานผ่านช่องสัญญาณ ซอฟต์แวร์นี้จะพิมพ์ " ping " อย่างต่อเนื่อง ในการกำหนดรูปแบบช่อง คำนำหน้า " chan " จะมาพร้อมกับรายการที่ส่งบนช่องสัญญาณ" ในกรณีนี้ เราจะจัดเตรียมสตริง ในช่อง ข้อความจะถูกส่งและรับโดยใช้โอเปอเรเตอร์ " ping " หมายถึงการส่ง " ping ".

มีการใช้แชนเนลเพื่อให้ goroutine ทั้งสองซิงค์กัน ก่อนที่จะพยายามส่งข้อความข้ามช่องสัญญาณ เราเตอร์จะรอจนกว่าเครื่องพิมพ์จะพร้อมรับข้อความ คำนี้คือการยับยั้ง เมื่อสร้างแชนเนล อาจใช้พารามิเตอร์ที่สองสำหรับฟังก์ชัน make: c:= make (chan int, 1)

ทิศทางของช่อง

เราสามารถกำหนดการวางแนวของแบบฟอร์มช่องและพารามิเตอร์เพื่อรับหรือส่ง ตัวอย่างเช่น เครื่องหมายเมธอดของ Pinger สามารถแก้ไขได้ดังนี้:

func pinger(c chan<- string)

C สามารถส่งได้ในขณะนี้ การรับจาก c จะทำให้เกิดข้อผิดพลาดของรหัส ในทำนองเดียวกัน เราอาจแก้ไขผลลัพธ์เป็น:

func printer(c string -chan)

กึ่งช่องทางไม่มีข้อจำกัดเหล่านี้ สามารถระบุช่องสัญญาณสองทิศทางให้กับขั้นตอนที่ยอมรับเฉพาะช่องสัญญาณที่ส่งเท่านั้นหรือช่องที่รับได้เท่านั้น แต่ไม่สามารถระบุช่องสัญญาณแบบสองทิศทางได้

Go-channels

จะทำโกรูทีนได้อย่างไร?

วิธีการเปิด goroutine นั้นตรงไปตรงมา ใช้คีย์เวิร์ด " go " กับการเรียกใช้ฟังก์ชันเพื่อสร้าง goroutine ที่จะดำเนินการพร้อมกัน ที่นี่เราจะทำ goroutine สมมติว่าเรามีโปรแกรมที่มีสองฟังก์ชัน: ฟังก์ชันแรกคือฟังก์ชันต้อนรับ และอีกฟังก์ชันหนึ่งคือฟังก์ชันหลัก

เมื่อเราสร้าง goroutine ใหม่ โค้ดยินดีต้อนรับ () จะทำงานควบคู่ไปกับฟังก์ชัน main() เมื่อคุณทำรายการนี้คุณจะต้องประหลาดใจ โปรแกรมนี้แสดงเฉพาะข้อความการทำงานหลักเท่านั้น เกิดอะไรขึ้นกับ goroutine แรกหรือ goroutine ใหม่ที่เราเริ่มต้น? เพื่อให้เข้าใจว่าเหตุใดจึงเกิดขึ้น เราต้องทราบคุณสมบัติหลักสองประการของ goroutines ก่อน

  • ฟังก์ชัน goroutine ตอบสนองทันทีเมื่อเราสร้าง goroutine ใหม่ นอกเหนือจากฟังก์ชันต่างๆ แล้ว ผู้บริหารไม่ต้องพึ่งพา goroutine ดังนั้นจึงไม่รอให้การดำเนินการเสร็จสิ้น การดำเนินการถูกส่งไปยังบล็อกโค้ดต่อไปนี้หลังจากฟังก์ชัน goroutine นี่คือสาเหตุที่พารามิเตอร์ที่กำหนดจาก goroutine ถูกมองข้าม
  • goroutine พิเศษใดๆ ควรทำงานพร้อมกันกับ goroutine หลัก หาก goroutine หลักทำงานล้มเหลว โปรแกรมจะหยุดทำงาน และจะไม่มีการรัน goroutine เพิ่มเติม

ตอนนี้คุณเข้าใจแล้วว่าทำไมรหัสของเราถึงใช้งานไม่ได้ หลังจากการเรียกไปต้อนรับ () การควบคุมถูกถ่ายโอนไปยังบรรทัดของโค้ดต่อไปนี้ก่อนที่จะรอให้ Hello goroutine เสร็จสิ้น และฟังก์ชันหลักก็ส่งออกไป goroutine หลักตายเพราะไม่มีสคริปต์ให้ดำเนินการ ทำให้ goroutine สวัสดีทำงานไม่ได้

เราเรียกใช้เทคนิคการนอนหลับ ( time.sleep(1 * time.second)) เพื่อหยุด goroutine ชั่วคราวเป็นเวลา 1 วินาที ฟังก์ชัน to go welcome () มีเวลาเพียงพอในการดำเนินการก่อนที่ goroutine หลักจะออก ซอฟต์แวร์นี้เริ่มต้นเขียน " welcome goroutine " จากนั้นรอหนึ่งวินาทีก่อนที่จะพิมพ์ฟังก์ชันหลัก เราใช้เทคนิคการนอนหลับใน goroutine หลักเพื่อหยุดชั่วขณะเพื่อให้ goroutine อื่น ๆ เสร็จสิ้น

การสร้าง Goroutines หลายรายการ

เรากำลังจะเริ่มโปรแกรมอื่นเพื่อสร้าง goroutine หลายรายการ เราสามารถเริ่มต้นด้วยการสร้าง goroutine สองรายการที่จะดำเนินการพร้อมกัน goroutines ทั้งสองนี้คือ goroutines ตัวเลข [go ตัวเลข ()] และ goroutines ตัวอักษร [ go alphabets ()]

จำนวน goroutine จะอยู่เป็นเวลา 250 มิลลิวินาทีก่อนที่จะพิมพ์ 1 พักอีกครั้งก่อนที่จะพิมพ์ 2 และต่อไปจนกว่าจะสร้าง 5 ในทำนองเดียวกัน goroutine ที่เป็นตัวอักษรและตัวเลขจะแสดงตัวอักษรจาก a ถึง e จากนั้นรอ 400 มิลลิวินาที สุดท้าย goroutine หลักสร้างจำนวนเต็มและอักขระที่เป็นตัวอักษรและตัวเลขคละกันและหยุดชั่วขณะ จากนั้น goroutine หลักจะสิ้นสุดลง

ข้อผิดพลาดในการเขียนโปรแกรมพร้อมกันบ่อยครั้ง

  • ไม่มีการซิงโครไนซ์เมื่อจำเป็น
  • ใช้เวลา. สลีปการโทรเพื่อทำการซิงโครไนซ์
  • ปล่อยให้ goroutines ห้อยค่าการคัดลอกของประเภทในแพ็คเกจการซิงค์มาตรฐาน
  • โทรซิงค์
  • รอกรุ๊ป
  • เพิ่มวิธีการผิดที่
  • ใช้แชนเนลเป็นแชนเนลปิดในวันพรุ่งนี้ ไม่ใช่จาก goroutine ผู้ส่งที่ทำงานล่าสุด

บทสรุป

ในบทความนี้ เราได้พัฒนาโปรแกรมที่ใช้คำหลัก go เพื่อเรียกใช้หนึ่ง goroutine และหลาย goroutines ที่พิมพ์จำนวนเต็มพร้อมกัน หลังจากเริ่มโปรแกรมนั้น เราได้สร้างช่องใหม่ซึ่งเราใช้เพื่อสร้างตัวเลขใน goroutine หนึ่งและส่งต่อไปยัง goroutine อีกอันหนึ่งเพื่อให้สามารถแสดงบนหน้าจอได้ เพื่อเป็นการสาธิตขั้นสุดท้ายของวิธีเริ่มต้น goroutine เพื่อเพิ่มความเร็วให้กับแอปพลิเคชันของคุณบนระบบมัลติคอร์ คุณได้เปิดใช้งาน goroutine "การพิมพ์" จำนวนมากพร้อมกัน

ดังที่เราทราบ goroutines เป็นวิธีการทำงานที่รวดเร็วและมีประสิทธิภาพมากขึ้น นี่เป็นหนึ่งในขั้นตอนการปรับใช้ที่เสนอโดย AppMaster เพื่อปรับปรุงฟังก์ชันการทำงานของแอปพลิเคชันของคุณ ด้วย AppMaster แม้แต่บุคคลที่ไม่มีความรู้ด้านการเขียนโปรแกรมเพียงเล็กน้อยหรือไม่มีเลยก็สามารถทำงานที่ท้าทายให้สำเร็จได้ผ่านการเขียนโค้ดด้วยตนเอง

AppMaster เป็นแพลตฟอร์มแบบ no-code ที่สามารถ สร้างแอปพลิเคชันมือถือและเว็บ รวมถึงแบ็กเอนด์ ข้อเท็จจริงที่น่าสนใจ AppMaster สร้างแบ็กเอนด์โดย Go ที่ 22,000 บรรทัดต่อวินาที และคุณสามารถเข้าถึงซอร์สโค้ดได้

กระทู้ที่เกี่ยวข้อง

วิธีพัฒนาระบบจองโรงแรมที่ปรับขนาดได้: คู่มือฉบับสมบูรณ์
วิธีพัฒนาระบบจองโรงแรมที่ปรับขนาดได้: คู่มือฉบับสมบูรณ์
เรียนรู้วิธีการพัฒนาระบบการจองโรงแรมที่ปรับขนาดได้ สำรวจการออกแบบสถาปัตยกรรม คุณสมบัติหลัก และตัวเลือกทางเทคโนโลยีที่ทันสมัยเพื่อมอบประสบการณ์ลูกค้าที่ราบรื่น
คู่มือทีละขั้นตอนในการพัฒนาแพลตฟอร์มการจัดการการลงทุนตั้งแต่เริ่มต้น
คู่มือทีละขั้นตอนในการพัฒนาแพลตฟอร์มการจัดการการลงทุนตั้งแต่เริ่มต้น
สำรวจเส้นทางที่มีโครงสร้างเพื่อสร้างแพลตฟอร์มการจัดการการลงทุนประสิทธิภาพสูงโดยใช้ประโยชน์จากเทคโนโลยีและวิธีการที่ทันสมัยเพื่อเพิ่มประสิทธิภาพ
วิธีเลือกเครื่องมือตรวจติดตามสุขภาพให้เหมาะสมกับความต้องการของคุณ
วิธีเลือกเครื่องมือตรวจติดตามสุขภาพให้เหมาะสมกับความต้องการของคุณ
ค้นพบวิธีการเลือกเครื่องมือตรวจสุขภาพที่เหมาะสมกับไลฟ์สไตล์และความต้องการของคุณ คำแนะนำที่ครอบคลุมสำหรับการตัดสินใจอย่างรอบรู้
เริ่มต้นฟรี
แรงบันดาลใจที่จะลองสิ่งนี้ด้วยตัวเอง?

วิธีที่ดีที่สุดที่จะเข้าใจถึงพลังของ AppMaster คือการได้เห็นมันด้วยตัวคุณเอง สร้างแอปพลิเคชันของคุณเองในไม่กี่นาทีด้วยการสมัครสมาชิกฟรี

นำความคิดของคุณมาสู่ชีวิต