[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-context-golang-concurrent-tasks-all--*":3,"academy-blog-translations-bji62kx3jye65h3":84},{"data":4,"page":72,"perPage":72,"totalItems":72,"totalPages":72},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":78,"keywords":79,"locale":54,"published_at":80,"scheduled_at":13,"school_blog":76,"short_description":81,"slug":82,"status":74,"title":6,"updated":83,"updated_by":13,"views":77},"EP.62 การใช้ Context ใน Golang เพื่อจัดการกับการทำงานที่มีการรอคอย (concurrent tasks)","sclblg987654321","school_blog_translations","\u003Cp>แพ็กเกจ Context ใน Golang เป็นเครื่องมือที่สำคัญเมื่อเราทำงานกับ concurrent tasks มันช่วยให้เราสามารถจัดการ task ที่รอคอย, จัดการการยกเลิก, และตั้งเวลาให้กับการทำงานที่อาจใช้เวลานาน ในตอนนี้เราจะเรียนรู้วิธีการใช้ \u003Ccode inline=\"\">context\u003C\u002Fcode> เพื่อควบคุมการทำงานหลายๆ งานพร้อมกันและให้สามารถยกเลิกหรือตั้งเวลาให้กับการทำงานเหล่านั้นได้อย่างมีประสิทธิภาพ การใช้ \u003Ccode inline=\"\">context\u003C\u002Fcode> จะช่วยให้เราจัดการกับทรัพยากรได้อย่างเหมาะสม และช่วยในการสร้างแอปพลิเคชันที่มีประสิทธิภาพและสามารถขยายตัวได้\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>ทำไม Context ถึงสำคัญ?\u003C\u002Fh2>\u003Cp>แพ็กเกจ Context ใช้สำหรับการจัดการการทำงานที่มีการรอคอยหลายๆ งานพร้อมกัน โดยสามารถ:\u003C\u002Fp>\u003Cul>\u003Cli>ยกเลิกงานที่ไม่จำเป็น: เราสามารถยกเลิก task ได้เมื่อไม่ต้องการให้มันทำงาน เช่น เมื่อผู้ใช้ยกเลิกคำขอหรือเมื่อเซิร์ฟเวอร์ปิด\u003C\u002Fli>\u003Cli>ตั้งเวลา: เราสามารถตั้งเวลาให้กับงานที่ทำงานนานเกินไป โดยไม่ให้มันทำงานต่อไปได้\u003C\u002Fli>\u003Cli>ส่งข้อมูลข้าม goroutine: \u003Ccode inline=\"\">context\u003C\u002Fcode> ช่วยให้เราสามารถส่งข้อมูล (เช่น กำหนดเวลา หรือสัญญาณยกเลิก) ไปยัง goroutine ต่างๆ ได้อย่างสะดวก\u003C\u002Fli>\u003C\u002Ful>\u003Cp>ข้อดีของการใช้ Context:\u003C\u002Fp>\u003Cul>\u003Cli>การจัดการทรัพยากรที่ดีขึ้น: ช่วยให้เราควบคุมทรัพยากรได้ดีขึ้น และมั่นใจว่าไม่มีการทำงานที่ไม่จำเป็นต่อไป\u003C\u002Fli>\u003Cli>การจัดการ concurrency ได้ง่ายขึ้น: ช่วยให้เราแยกการจัดการงานที่ทำงานพร้อมกันให้ชัดเจนและง่ายต่อการดูแล\u003C\u002Fli>\u003Cli>การยกเลิกและตั้งเวลา: สามารถยกเลิกหรือตั้งเวลาให้กับงานต่างๆ ได้อย่างมีประสิทธิภาพ ช่วยให้การทำงานไม่ถูกบล็อกหรือล่าช้า\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>โครงสร้างการทำงานของ Context\u003C\u002Fh2>\u003Cp>แพ็กเกจ \u003Ccode inline=\"\">context\u003C\u002Fcode> ใน Golang ออกแบบมาเพื่อส่งสัญญาณการยกเลิก, กำหนดเวลา, หรือส่งข้อมูลข้าม goroutine ระหว่างการทำงานหลายๆ งาน\u003C\u002Fp>\u003Ch3>ส่วนประกอบหลักของ Context:\u003C\u002Fh3>\u003Col>\u003Cli>Context Objects:\u003Cul>\u003Cli>\u003Ccode inline=\"\">context.Background()\u003C\u002Fcode> – ใช้เป็น context รากฐาน\u003C\u002Fli>\u003Cli>\u003Ccode inline=\"\">context.TODO()\u003C\u002Fcode> – ใช้เมื่อไม่แน่ใจว่าจะใช้ context อะไร\u003C\u002Fli>\u003Cli>\u003Ccode inline=\"\">context.WithCancel()\u003C\u002Fcode> – สร้าง context ที่สามารถยกเลิกได้\u003C\u002Fli>\u003Cli>\u003Ccode inline=\"\">context.WithTimeout()\u003C\u002Fcode> – สร้าง context ที่มีการตั้งเวลา\u003C\u002Fli>\u003Cli>\u003Ccode inline=\"\">context.WithDeadline()\u003C\u002Fcode> – สร้าง context ที่มีการตั้งกำหนดเวลา\u003C\u002Fli>\u003C\u002Ful>\u003C\u002Fli>\u003Cli>การยกเลิก:\u003Cul>\u003Cli>เราสามารถยกเลิก context โดยใช้ \u003Ccode inline=\"\">cancel()\u003C\u002Fcode> และการยกเลิกนี้จะส่งผลให้ goroutines ที่ใช้ context นั้นได้รับสัญญาณยกเลิก\u003C\u002Fli>\u003C\u002Ful>\u003C\u002Fli>\u003Cli>การตั้งเวลาและกำหนดเวลา:\u003Cul>\u003Cli>สามารถตั้งเวลาให้กับงานเพื่อป้องกันไม่ให้มันทำงานนานเกินไป\u003C\u002Fli>\u003C\u002Ful>\u003C\u002Fli>\u003C\u002Fol>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>วิธีการใช้ Context ในการจัดการกับ Concurrent Tasks\u003C\u002Fh2>\u003Cp>การใช้ \u003Ccode inline=\"\">context\u003C\u002Fcode> กับหลายๆ concurrent tasks ต้องส่ง context ไปยังทุกๆ goroutine เพื่อให้แต่ละ goroutine สามารถรับสัญญาณการยกเลิกหรือการตั้งเวลา\u003C\u002Fp>\u003Ch3>ขั้นตอนการใช้งาน:\u003C\u002Fh3>\u003Col>\u003Cli>สร้าง Context:\u003Cbr>ใช้ \u003Ccode inline=\"\">context.Background()\u003C\u002Fcode> หรือ \u003Ccode inline=\"\">context.TODO()\u003C\u002Fcode> เป็น context รากฐาน\u003C\u002Fli>\u003Cli>รัน Concurrent Tasks:\u003Cbr>เมื่อสร้าง goroutines ให้ส่ง context ไปให้เพื่อให้แต่ละงานสามารถตรวจสอบการยกเลิกและการตั้งเวลาได้\u003C\u002Fli>\u003Cli>การยกเลิก:\u003Cbr>ใช้ \u003Ccode inline=\"\">context.WithCancel()\u003C\u002Fcode> เพื่อสร้าง context ที่สามารถยกเลิกได้ และเมื่อยกเลิก context งานที่เชื่อมโยงกับ context นี้จะได้รับสัญญาณยกเลิก\u003C\u002Fli>\u003Cli>การตั้งเวลา:\u003Cbr>ใช้ \u003Ccode inline=\"\">context.WithTimeout()\u003C\u002Fcode> เพื่อตั้งเวลาให้กับการทำงาน ซึ่งจะยกเลิกการทำงานหากงานนั้นใช้เวลานานเกินไป\u003C\u002Fli>\u003C\u002Fol>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>ตัวอย่างโค้ดสำหรับการจัดการ Concurrent Tasks ด้วย Context\u003C\u002Fh2>\u003Col>\u003Cli>\u003Ch3>การใช้ \u003Ccode inline=\"\">context\u003C\u002Fcode> ในการยกเลิก Concurrent Tasks\u003C\u002Fh3>\u003C\u002Fli>\u003C\u002Fol>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"time\"\n)\n\nfunc task(ctx context.Context, id int) {\n    select {\n    case &lt;-time.After(2 * time.Second):  \u002F\u002F จำลองงานที่ใช้เวลา\n        fmt.Printf(\"Task %d completed\\n\", id)\n    case &lt;-ctx.Done():  \u002F\u002F ถ้า context ถูกยกเลิก\n        fmt.Printf(\"Task %d canceled\\n\", id)\n    }\n}\n\nfunc main() {\n    ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)\n    defer cancel()\n\n    for i := 1; i &lt;= 5; i++ {\n        go task(ctx, i)\n    }\n\n    time.Sleep(4 * time.Second) \u002F\u002F รอให้งานเสร็จหรือล้มเหลว\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>ในโค้ดนี้ เราสร้าง context ที่มีเวลา 3 วินาที และถ้างานใช้เวลานานเกินไปมันจะถูกยกเลิก\u003C\u002Fp>\u003Col start=\"2\">\u003Cli>\u003Ch3>การใช้ Context กับการยกเลิกสำหรับงานที่ทำงานนาน\u003C\u002Fh3>\u003C\u002Fli>\u003C\u002Fol>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"time\"\n)\n\nfunc longRunningTask(ctx context.Context) {\n    for {\n        select {\n        case &lt;-time.After(1 * time.Second):\n            fmt.Println(\"Running task...\")\n        case &lt;-ctx.Done():  \u002F\u002F ตรวจจับการยกเลิก\n            fmt.Println(\"Task canceled\")\n            return\n        }\n    }\n}\n\nfunc main() {\n    ctx, cancel := context.WithCancel(context.Background())\n\n    go longRunningTask(ctx)\n\n    time.Sleep(3 * time.Second)\n    cancel() \u002F\u002F ยกเลิกงานหลังจาก 3 วินาที\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>ในตัวอย่างนี้ เราใช้ \u003Ccode inline=\"\">context.WithCancel()\u003C\u002Fcode> เพื่อยกเลิกงานที่ทำงานนานเกินไป\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>การทดสอบ Concurrent Tasks ด้วย Context\u003C\u002Fh2>\u003Cp>หลังจากที่เราใช้ context แล้ว การทดสอบระบบจะช่วยให้มั่นใจว่า tasks ถูกจัดการได้อย่างมีประสิทธิภาพ\u003C\u002Fp>\u003Ch3>การทดสอบที่ควรทำ:\u003C\u002Fh3>\u003Cul>\u003Cli>ทดสอบการยกเลิกงาน: ตรวจสอบว่างานสามารถยกเลิกได้เมื่อ context ถูกยกเลิก\u003C\u002Fli>\u003Cli>ทดสอบการตั้งเวลา: ตรวจสอบว่างานที่เกินเวลาจะถูกยกเลิก\u003C\u002Fli>\u003Cli>ทดสอบการซิงโครไนซ์ของ goroutines: ตรวจสอบว่า goroutines ทำงานร่วมกันได้และทำงานตามที่ต้องการเมื่อได้รับสัญญาณยกเลิก\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Chr>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>ท้าให้ลอง!\u003C\u002Fh3>\u003Cp>ลองนำ \u003Cstrong>context ในการจัดการคำขอ HTTP\u003C\u002Fstrong> มาจัดการเวลาและยกเลิกคำขอที่ใช้เวลานาน!\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>EP ถัดไป:\u003C\u002Fstrong>\u003Cbr>ใน EP ถัดไป เราจะมาดู \u003Cstrong>การสร้างระบบการยืนยันตัวตนผู้ใช้ (User Authentication System) สำหรับ WebSocket\u003C\u002Fstrong> เพื่อให้ผู้ใช้สามารถยืนยันตัวตนก่อนเข้าร่วมห้องแชท!\u003C\u002Fp>","95_11zon_2nl6eg2jiv.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002F2hovbk2n1ieorle\u002F95_11zon_2nl6eg2jiv.webp","2026-03-04 08:48:26.956Z","",{"keywords":15,"locale":48,"school_blog":58},[16,23,28,33,38,43],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:48:25.439Z","n9r2r9xc1xok70g","การทำงานพร้อมกันใน Golang","2026-04-10 16:13:47.226Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:48:25.812Z","sjjiyydh2zn4mjm","การตั้งเวลาใน Golang","2026-04-10 16:13:47.361Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:48:26.008Z","5buf2ifq8tf997e","การยกเลิกงานใน Golang","2026-04-10 16:13:47.428Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":37,"updated_by":13},"2026-03-04 08:48:26.308Z","n84ea80h1lx8ntq","การจัดการ concurrent tasks ใน Golang","2026-04-10 16:13:47.615Z",{"collectionId":17,"collectionName":18,"created":39,"created_by":13,"id":40,"name":41,"updated":42,"updated_by":13},"2026-03-04 08:48:24.452Z","6295poaan1deg78","Concurrent tasks Golang","2026-04-10 16:13:46.837Z",{"collectionId":17,"collectionName":18,"created":44,"created_by":13,"id":45,"name":46,"updated":47,"updated_by":13},"2026-03-04 08:48:24.249Z","itgw0smx0evk3u7","Golang context","2026-04-10 16:13:46.706Z",{"code":49,"collectionId":50,"collectionName":51,"created":52,"flag":53,"id":54,"is_default":55,"label":56,"updated":57},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":59,"collectionId":60,"collectionName":61,"expand":62,"id":76,"views":77},"wqxt7ag2gn7xcmk","pbc_2105096300","school_blogs",{"category":63},{"blogIds":64,"collectionId":65,"collectionName":66,"created":67,"created_by":13,"id":59,"image":68,"image_alt":13,"image_path":69,"label":70,"name":71,"priority":72,"publish_at":73,"scheduled_at":13,"status":74,"updated":75,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:33:53.210Z","59ty92ns80w_15oc1implw.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fwqxt7ag2gn7xcmk\u002F59ty92ns80w_15oc1implw.png",{"en":71,"th":71},"Golang The Series",1,"2026-03-16 04:39:38.440Z","published","2026-04-25 02:32:15.470Z","bji62kx3jye65h3",252,"2hovbk2n1ieorle",[20,25,30,35,40,45],"2025-07-07 03:34:27.384Z","เรียนรู้วิธีการใช้ Context ใน Golang เพื่อจัดการกับการทำงานที่มีการรอคอย และควบคุมการทำงานของหลายๆ task (concurrent tasks) ได้อย่างมีประสิทธิภาพ","context-golang-concurrent-tasks","2026-04-22 07:10:10.982Z",{"th":82}]