ในกลุ่ม 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 hardware อย่างไร ให้เหมาะสมที่สุด ?
ทั้งสองไม่เหมือนกันนะ แต่ดันเกี่ยวข้องกัน ไปกินเบียร์เย็น ๆ พร้อมกันสองแก้วดีกว่า !!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/