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 โดยคร่าว ๆ แล้ว ในบทความถัดไป จะมาแนะนำการใช้งาน 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/
Multiprocessing และ Threading ใน Python คืออะไร และทำไมคนทำงานในสาย Data ถึงควรรู้จัก