Multiprocessing และ Threading ใน Python คืออะไร และทำไมคนทำงานในสาย Data ถึงควรรู้จัก

บทความนี้ เราจะมาทำความรู้จักกับ libraries ทั้งสองตัวว่าต่างกันอย่างไร และตัวอย่างในการใช้งาน Multiprocessing และ Threading
29 ตุลาคม ค.ศ. 2021 โดย
Administrator

Multiprocessing และ Threading

ถูกสร้างขึ้นเพื่อเพิ่มความเร็ว

ในการประมวลผลให้กับคอมพิวเตอร์ของเรา 

​ในโปรเจคที่เกี่ยวกับ Data ทั้ง Data Scientist หรือ Data Engineer น่าจะเคยพบปัญหาเมื่อต้องทำงานกับ Data set ที่มีขนาดใหญ่ จะนำไปสู่ระยะเวลาประมวลผลที่นานขึ้นอย่างหลีกเลี่ยงไม่ได้ และโดยปกติ Data set ที่ว่านั้น มักจะมีขนาดใหญ่มากขึ้นกว่าเดิมแปรผันตามระยะเวลาด้วย


​โดยปกติวิธีรับมือที่ง่ายที่สุดนั้นคือ การ Optimization Algorithm หรือ Code ของเราให้มีประสิทธิภาพสูงขึ้น รองรับ Data set ที่มีขนาดใหญ่มากขึ้น อีกวิธีนึงที่น่าสนใจคือ การทำ Parallelization หรือการประมวลผลแบบคู่ขนาน โดยใน Python นั้นมี built-in libraries สองตัวให้เลือกใช้ นั่นคือ Multiprocessing และ Threading ทั้งสองตัวถูกสร้างเพื่อเพิ่มความเร็วในการประมวลผลให้แก่คอมพิวเตอร์ของเรา

​ก่อนที่จะมาทำความรู้จักกับ Libraries ทั้งสองตัวนั้น เราต้องมาเรียนรู้นิยามของคำบางคำก่อน เพื่อให้เกิดความเข้าใจตรงกัน

 Program คือ ไฟล์ที่ประกอบไปด้วยขั้นตอนสำหรับการดำเนินการบางอย่าง เช่น การประมวลผล

 Process  คือ Program ที่ถูกโหลดลงในหน่วยความจำ พร้อมกับทรัพยากรที่ต้องใช้ในการทำงาน Process จะมีพื้นที่หน่วยความจำเป็นของตัวเอง

 Thread  เป็นหน่วยย่อยที่อยู่ใน Process อีกที ใน 1 Process สามารถมีได้หลาย Thread โดย Thread จะใช้พื้นที่หน่วยความจำของ Process ในการประมวลผล ซึ่งหากมีหลาย Thread ใน 1 Process พื้นที่หน่วยความจำของ Process จะถูกใช้ร่วมกันในแต่ละ Thread (แบบสั้น ๆ ก็คือ Thread ไม่มีพื้นที่หน่วยความจำเป็นของตัวเอง ทุก Thread ใน Process จะแชร์หน่วยความจำของ Process มาแบ่งกันใช้)

 Single threading  คือ การมี 1 Thread ใน 1 Process และ Multithreading นั้น หมายถึง การมีหลาย Thread ในทางเทคนิคแล้ว การมีหลาย Thread นั้นจะถูกสร้างขึ้นโดย process เพื่อการประมวลผลหลายสิ่งที่ต่างกันในเวลาเดียว แต่จะประมวลผลทีละอัน (กล่าวคือ ถูกสร้างขึ้นมาพร้อมกัน แต่ตอนประมวลผลไม่ได้ทำพร้อมกัน) สิ่งนี้อาจทำให้เกิดความเข้าใจผิดว่า แต่ละ Thread ประมวลผลไปพร้อมกัน ๆ ใน Python จะมีสิ่งที่เรียกว่า the Global Interpreter Lock (GIL) เพื่อป้องกันไม่ให้แต่ละ Threads ประมวลผลพร้อมกัน (The Global Interpreter Lock นั้น จะมาช่วยเราจัดการในส่วนที่เป็น Low-Level เช่น Memory Management ซึ่งขอไม่ลงรายละเอียด)

 Multiprocessing  คือ การมีหลาย ๆ Process ในการประมวลผล เป็นวิธีทำที่ให้เกิดการประมวลผลแบบคู่ขนานอย่างแท้จริง การมีหลาย Process นั้น จะต้องประมวลผลโดยใช้หลาย CPU Cores โดยแต่ละ Process จะไม่แชร์ทรัพยากรในการประมวลผลระหว่างกัน (ไม่เหมือน Thread ใน Process เดียวกัน) โดยการมีหลาย Process นั้น ในแต่ละ Process ก็สามารถมีหลาย Thread แต่ละ Thread จะแชร์ทรัพยาการในการประมวลผลภายใน Process เดียวกัน

จากการอธิบายข้างต้นอาจจะดูงง ๆ ลองดูภาพนี้แล้วจะเข้าใจมากขึ้นครับ

แกน Y นั้นเป็นเวลา มีวงกลมเป็นตัวแทนของ Process และตัวหนอนเป็นสัญลักษณ์แทน Thread จะเห็นเวลาที่ช่วงเวลาใดเวลาหนึ่งนั้นจะมีเพียง Thread เดียวที่กำลังประมวลผลอยู่ภายใน process นั้น

​จากภาพข้างต้น จะเห็นว่าแกน Y นั้นเป็นเวลา มีวงกลมเป็นตัวแทนของ Process และตัวหนอนเป็นสัญลักษณ์แทน Thread จะเห็นเวลาที่ช่วงเวลาใดเวลาหนึ่งนั้นจะมีเพียง Thread เดียวที่กำลังประมวลผลอยู่ภายใน process นั้น ภาพนี้เป็นตัวอย่างของ Multithreading

​Multiprocessing ถ้ายกตัวอย่างง่าย ๆ ให้ถึงเว็บ Browser ที่เปิด tab ไว้หลายๆ  หน้า แต่ละหน้าที่เราเปิดทิ้งไว้ก็จะมี Process ของตัวเองในการประมวลผล

Spotify App เป็น Multithreading เหมือนที่แสดงในภาพไปก่อนหน้านี้คือ มีแค่ Process เดียว แต่ในส่วนที่เป็น Firefox App จะเป็น Multiprocessing คือ จะมีหลาย Process และแต่ละ Process ก็จะเป็น Multithreading


​จากภาพจะเห็นตัวอย่างว่า Spotify App เป็น Multithreading เหมือนที่แสดงในภาพไปก่อนหน้านี้คือ มีแค่ Process เดียว แต่ในส่วนที่เป็น Firefox App จะเป็น Multiprocessing คือ จะมีหลาย Process และแต่ละ Process ก็จะเป็น Multithreading


​Use case ที่น่าสนใจสำหรับการใช้ Threading คือ การใช้ร่วมกับการทำ Web Scraping ในกรณีที่หน้าเว็ปของเราต้องมีการรอโหลดก่อนที่จะสามารถดึงข้อมูลการรอโหลดข้อมูลที่ละหน้าจึงเป็นการเสียเวลาอย่างมาก ในกรณีนี้เราจึงสามารถใช้ Threading ในการโหลดหน้าเว็ปได้


อีกตัวอย่างคือ Tensorflow ที่ใช้ Threading ในการ Transform Data


​ตัวอย่างการใช้งาน Multiprocessing นั้น ได้แก่ Pytorch Dataloader ใช้ Multiprocessing ในการโหลด Data เข้ามาใน GPU ซึ่งการใช้ Multiprocessing นั้น ช่วยลดคอขวดในการประมวลผลข้อมูลได้อย่างมาก

​ในตอนนี้เราได้รู้จัก Multiprocessing และ Threading โดยคร่าว ๆ แล้ว ในบทความถัดไป จะมาแนะนำการใช้งาน Multiprocessing และ Threading ใน python

References

[1] https://blog.floydhub.com/multiprocessing-vs-threading-in-python-what-every-data-scientist-needs-to-know/

[2] https://medium.com/contentsquare-engineering-blog/multithreading-vs-multiprocessing-in-python-ece023ad55a

[3] https://www.geeksforgeeks.org/difference-between-multithreading-vs-multiprocessing-in-python/

Administrator 29 ตุลาคม ค.ศ. 2021
แชร์โพสต์นี้
แท็ก