Multiprocessing และ Threading ใน Python คืออะไร และทำไมคนทำงานในสาย Data ถึงควรรู้จัก
บทความนี้เราจะมาทำความรู้จักกับ libraries ทั้งสองตัว ว่าต่างกันอย่างไร และตัวอย่างในการใช้งาน Multiprocessing และ Threading
29 October, 2021 by
Multiprocessing และ Threading ใน Python คืออะไร และทำไมคนทำงานในสาย Data ถึงควรรู้จัก
Jula Jiratrakanvong (Piw)
| No comments yet

 
 

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 นั้น ภาพนี้เป็นตัวอย่างของ Multithreading

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

         จากภาพจะเห็นตัวอย่างว่า 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 โดยคร่าวๆ แล้ว ในบทความถัดไป จะ

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/ 

Multiprocessing และ Threading ใน Python คืออะไร และทำไมคนทำงานในสาย Data ถึงควรรู้จัก
Jula Jiratrakanvong (Piw) 29 October, 2021
Share this post
Archive
Sign in to leave a comment