ในกลุ่ม Golang Thailand มีการพูดคุยเรื่อง Parallel มันต่างจาก Concurrent อย่างไร ?
มันเป็นสิ่งที่สับสนและมึนงงเยอะมาก ๆ
ผมก็งง ๆ อยู่เช่นกัน

โดยทั้งสองอย่างนั้นมันมีอยู่ในทุก ๆ ส่วนของระบบงาน คือ

  • Hardware
  • Operating System (OS)
  • Programming ในภาษาต่าง ๆ

ดังนั้นลองมาหาคำตอบกันหน่อยสิ

ปล. เขียนไปแบบงง ๆ

Concurrent เป็นการจัดการหลาย ๆ งานในเวลาเดียวกัน

งานคือสิ่งที่เราต้องการให้ทำจนเสร็จสิ้น
ยกตัวอย่างเช่น
เราไม่สามารถใช้มือเดียวยกแก้วเบียร์พร้อมกับเขียน blog ได้
นั่นหมายความว่า เราสามารถจัดการงานได้เพียงงานเดียว เช่น ยกแก้วเบียร์เพื่อกิน

เราทำการกินเบียร์ไปสักคำ จากนั้นวางแก้วลง
แล้วมาเขียน blog ไปสักสองถึงสามประโยค
จากนั้นกลับมายกแก้วเบียร์
จากนั้นวางแก้วแล้วไปถือโทรศัพท์
จากนั้นกลับมายกแก้วเบียร์ต่อ …

สังเกตุไหมว่า
แต่ละงานจะเข้ามาพร้อม ๆ กัน
แต่เราใช้มือเพียงข้างเดียว ดังนั้นจึงต้องเลือกว่าจะทำงานอะไรก่อนหลัง
จากนั้นทำการสลับงานที่ทำไปมา
ในขณะที่แต่ละงานยังไม่เสร็จเลย
นั่นคือการจัดการคิวงานนั่นเอง
มันคือเรื่อง Context Switching คุ้น ๆ กันไหมนะ
มันคือ multi-tasking หรือเปล่านะ ?

Parallel เป็นการ execute หรือทำงานหลาย ๆ งานพร้อมกันในเวลาเดียวกัน

แต่ก่อนที่จะทำการทำงานพร้อม ๆ กันได้นั้น ต้องทำการจัดการงานต่าง ๆ
หรือทำการแบ่งงานเป็นงานย่อย ๆ

จากตัวอย่างคือ
การยกแก้วเบียร์
การเขียน blog
การถือโทรศัพท์

จากนั้นลงมือทำงานต่าง ๆ พร้อม ๆ กันเลย
นั่นแสดงว่าเราต้องมีมากกว่า 1 มือมาทำงาน
แต่ละงานถูกทำงานงานแยกกันเป็นอิสระ
แน่นอนว่า ถ้ามองในมุมของนักพัฒนาแล้ว
แต่ละงานต้องแยกกันอย่างชัดเจน เป็นอิสระแก่กัน

สังเกตุไหมว่าทั้งสองเรื่อง คือ เทคนิคการแบ่งงานเป็นงานย่อย ๆ

เพื่อให้สามารถทำงานแบบขนานหรือ parallel ได้
เพื่อเพิ่มประสิทธิภาพการทำงานของระบบ
รวมทั้งช่วยจัดการความเสี่ยงต่าง ๆ ที่อาจจะเกิดขึ้นเมื่อทำงานพร้อม ๆ กัน

บางงานอาจจะทำงานแบบ Concurrent แต่ไม่ Parallel
บางงานอาจจะทำงานแบบ Parallel แต่ไม่ Concurrent

อ่านแล้วงงดีไหม ?

โดยสรุปแล้ว

Concurrent เป็นการจัดการหลาย ๆ งานในเวลาเดียวกัน
นั่นคือเรื่องของโครงสร้างเพื่อจัดการปัญหา (Structure)
มักจะพูดถึง Modularity, Responsive และ Maintainability
สิ่งที่ได้ตามมาคือ ประสิทธิภาพของการทำงาน
โดยจะให้ความสำคัญกับเรื่องของ

  • จะเริ่มทำงานเมื่อใด ?
  • ข้อมูลมีการแลกเปลี่ยนอย่างไร ?
  • จัดการการเข้าถึง shared resource กันอย่างไร ?

Parallel เป็นการทำงานหลาย ๆ งานในเวลาเดียวกัน
นั่นคือเรื่องของทำงาน หรือ ประมวลผล (Execution)
เป้าหมายหลักเพิ่มประสิทธิภาพของการทำงาน

Parallel hardware ประกอบไปด้วย Multi-core processor, GPU และ computer cluster เป็นต้น
Parallel programming จะเน้นในเรื่อง

  • จะแบ่งงานใหญ่ ๆ ออกเป็นงานย่อย ๆ ได้อย่างไร ?
  • จะใช้งาน parallel hardware อย่างไร ให้เหมาะสมที่สุด ?

เพื่อทำให้การประมวลผลรวดเร็วสุด ๆ
การประมวลผลข้อมูลขนาดใหญ่และซับซ้อน เช่น Data analysis, 3D rendering เป็นต้น

ทั้งสองไม่เหมือนกันนะ แต่ดันเกี่ยวข้องกัน
ไปกินเบียร์เย็น ๆ พร้อมกันสองแก้วดีกว่า !!

Reference Websites
https://www.coursera.org/learn/parprog1/
https://takuti.me/note/parallel-vs-concurrent/
http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html
http://www.dietergalea.com/parallelism-concurrency/
https://talks.golang.org/2012/waza.slide#1
https://www.braveclojure.com/concurrency/