การทำงานพร้อมกันใน Python - บทนำ
ในบทนี้เราจะเข้าใจแนวคิดของการทำงานพร้อมกันใน Python และเรียนรู้เกี่ยวกับเธรดและกระบวนการต่างๆ
Concurrency คืออะไร?
พูดง่ายๆว่าภาวะพร้อมกันคือการเกิดเหตุการณ์สองเหตุการณ์ขึ้นไปในเวลาเดียวกัน ภาวะพร้อมกันเป็นปรากฏการณ์ทางธรรมชาติเนื่องจากหลายเหตุการณ์เกิดขึ้นพร้อมกันในช่วงเวลาใดเวลาหนึ่ง
ในแง่ของการเขียนโปรแกรมการทำงานพร้อมกันคือเมื่อสองงานทับซ้อนกันในการดำเนินการ ด้วยการเขียนโปรแกรมพร้อมกันประสิทธิภาพของแอปพลิเคชันและระบบซอฟต์แวร์ของเราสามารถปรับปรุงได้เนื่องจากเราสามารถจัดการกับคำขอพร้อมกันได้แทนที่จะรอให้คำขอก่อนหน้านี้เสร็จสมบูรณ์
การทบทวนประวัติศาสตร์ของภาวะพร้อมกัน
ประเด็นต่อไปนี้จะทำให้เราได้รับการทบทวนประวัติศาสตร์โดยย่อเกี่ยวกับภาวะพร้อมกัน -
จากแนวคิดของทางรถไฟ
ภาวะพร้อมกันมีความสัมพันธ์อย่างใกล้ชิดกับแนวคิดของทางรถไฟ ด้วยทางรถไฟมีความจำเป็นที่จะต้องจัดการกับรถไฟหลายขบวนในระบบรางเดียวกันเพื่อให้รถไฟทุกขบวนไปถึงจุดหมายปลายทางได้อย่างปลอดภัย
การประมวลผลพร้อมกันในสถาบันการศึกษา
ความสนใจในวิทยาการคอมพิวเตอร์พร้อมกันเริ่มจากงานวิจัยที่ตีพิมพ์โดย Edsger W. Dijkstra ในปี 1965 ในบทความนี้เขาระบุและแก้ไขปัญหาการกีดกันซึ่งกันและกันซึ่งเป็นคุณสมบัติของการควบคุมภาวะพร้อมกัน
อนุพันธ์ของภาวะพร้อมกันระดับสูง
ในช่วงไม่กี่ครั้งที่ผ่านมาโปรแกรมเมอร์กำลังได้รับการปรับปรุงโซลูชันพร้อมกันเนื่องจากการเปิดตัวไพรเมอร์ระดับสูงพร้อมกัน
ปรับปรุงการทำงานพร้อมกันด้วยภาษาโปรแกรม
ภาษาโปรแกรมเช่น Golang, Rust และ Python ของ Google ได้พัฒนาอย่างไม่น่าเชื่อในด้านต่างๆซึ่งช่วยให้เราได้รับโซลูชันพร้อมกันที่ดีขึ้น
เธรดและมัลติเธรดคืออะไร?
Threadเป็นหน่วยประมวลผลที่เล็กที่สุดที่สามารถทำได้ในระบบปฏิบัติการ ไม่ใช่โปรแกรม แต่ทำงานภายในโปรแกรม กล่าวอีกนัยหนึ่งเธรดไม่ได้เป็นอิสระจากกัน แต่ละเธรดจะแชร์ส่วนโค้ดส่วนข้อมูล ฯลฯ กับเธรดอื่น ๆ พวกเขาเรียกอีกอย่างว่ากระบวนการที่มีน้ำหนักเบา
เธรดประกอบด้วยส่วนประกอบต่อไปนี้ -
ตัวนับโปรแกรมซึ่งประกอบด้วยที่อยู่ของคำสั่งปฏิบัติการถัดไป
Stack
ชุดทะเบียน
รหัสเฉพาะ
Multithreadingในทางกลับกันคือความสามารถของซีพียูในการจัดการการใช้งานระบบปฏิบัติการโดยดำเนินการหลายเธรดพร้อมกัน แนวคิดหลักของมัลติเธรดคือการบรรลุความเท่าเทียมกันโดยแบ่งกระบวนการออกเป็นหลายเธรด สามารถเข้าใจแนวคิดของมัลติเธรดได้ด้วยความช่วยเหลือของตัวอย่างต่อไปนี้
ตัวอย่าง
สมมติว่าเรากำลังเรียกใช้กระบวนการเฉพาะซึ่งเราเปิด MS Word เพื่อพิมพ์เนื้อหาลงไป เธรดหนึ่งจะถูกกำหนดให้เปิด MS Word และเธรดอื่นจะต้องพิมพ์เนื้อหาในนั้น และตอนนี้หากเราต้องการแก้ไขเธรดอื่นที่มีอยู่จะต้องใช้เธรดอื่นเพื่อทำงานแก้ไขและอื่น ๆ
กระบวนการและการประมวลผลหลายขั้นตอนคืออะไร?
กprocessถูกกำหนดให้เป็นเอนทิตีซึ่งแสดงถึงหน่วยพื้นฐานของงานที่จะดำเนินการในระบบ พูดง่ายๆก็คือเราเขียนโปรแกรมคอมพิวเตอร์ของเราในไฟล์ข้อความและเมื่อเรารันโปรแกรมนี้มันจะกลายเป็นกระบวนการที่ทำงานทั้งหมดที่กล่าวถึงในโปรแกรม ในระหว่างวงจรชีวิตของกระบวนการจะผ่านขั้นตอนต่างๆ - เริ่มพร้อมทำงานรอและยุติ
แผนภาพต่อไปนี้แสดงขั้นตอนต่างๆของกระบวนการ -
กระบวนการสามารถมีเธรดเดียวเรียกว่าเธรดหลักหรือเธรดหลายเธรดที่มีชุดรีจิสเตอร์ตัวนับโปรแกรมและสแต็กของตนเอง แผนภาพต่อไปนี้จะแสดงให้เราเห็นความแตกต่าง -
Multiprocessing,ในทางกลับกันคือการใช้ซีพียูสองหน่วยหรือมากกว่าภายในระบบคอมพิวเตอร์เครื่องเดียว เป้าหมายหลักของเราคือการได้รับศักยภาพสูงสุดจากฮาร์ดแวร์ของเรา เพื่อให้บรรลุเป้าหมายนี้เราจำเป็นต้องใช้คอร์ CPU เต็มจำนวนที่มีอยู่ในระบบคอมพิวเตอร์ของเรา การประมวลผลหลายขั้นตอนเป็นแนวทางที่ดีที่สุดในการดำเนินการดังกล่าว
Python เป็นหนึ่งในภาษาโปรแกรมยอดนิยม ต่อไปนี้เป็นเหตุผลบางประการที่ทำให้เหมาะสำหรับการใช้งานพร้อมกัน -
น้ำตาลสังเคราะห์
Syntactic sugar เป็นไวยากรณ์ภายในภาษาโปรแกรมที่ออกแบบมาเพื่อให้อ่านหรือแสดงออกได้ง่ายขึ้น ทำให้ภาษา "หวาน" ขึ้นสำหรับการใช้งานของมนุษย์: สิ่งต่าง ๆ สามารถแสดงออกได้ชัดเจนมากขึ้นกระชับขึ้นหรือในรูปแบบทางเลือกตามความชอบ Python มาพร้อมกับ Magic method ซึ่งสามารถกำหนดให้ทำงานกับวัตถุได้ เมธอด Magic เหล่านี้ใช้เป็นน้ำตาลในการสังเคราะห์และเชื่อมโยงกับคำหลักที่เข้าใจง่ายมากขึ้น
ชุมชนขนาดใหญ่
ภาษา Python ได้เห็นอัตราการนำไปใช้อย่างมากในหมู่นักวิทยาศาสตร์ข้อมูลและนักคณิตศาสตร์ซึ่งทำงานในสาขา AI การเรียนรู้ของเครื่องการเรียนรู้เชิงลึกและการวิเคราะห์เชิงปริมาณ
API ที่มีประโยชน์สำหรับการเขียนโปรแกรมพร้อมกัน
Python 2 และ 3 มี API จำนวนมากเฉพาะสำหรับการเขียนโปรแกรมแบบขนาน / พร้อมกัน ที่นิยมมากที่สุดคือthreading, concurrent.features, multiprocessing, asyncio, gevent and greenlets, เป็นต้น
ข้อ จำกัด ของ Python ในการใช้งานแอพพลิเคชั่นพร้อมกัน
Python มีข้อ จำกัด สำหรับการใช้งานพร้อมกัน ข้อ จำกัด นี้เรียกว่าGIL (Global Interpreter Lock)มีอยู่ใน Python GIL ไม่อนุญาตให้เราใช้ CPU หลายคอร์และด้วยเหตุนี้เราจึงสามารถพูดได้ว่าไม่มีเธรดที่แท้จริงใน Python เราสามารถเข้าใจแนวคิดของ GIL ได้ดังนี้ -
GIL (Global Interpreter Lock)
เป็นหนึ่งในหัวข้อที่ถกเถียงกันมากที่สุดในโลก Python ใน CPython GIL คือ mutex - การล็อกการยกเว้นซึ่งกันและกันซึ่งทำให้เธรดปลอดภัย กล่าวอีกนัยหนึ่งเราสามารถพูดได้ว่า GIL ป้องกันไม่ให้หลายเธรดเรียกใช้โค้ด Python พร้อมกัน สามารถล็อคได้ทีละเธรดเท่านั้นและหากเราต้องการรันเธรดก็จะต้องได้รับการล็อกก่อน แผนภาพที่แสดงด้านล่างจะช่วยให้คุณเข้าใจการทำงานของ GIL
อย่างไรก็ตามมีไลบรารีและการใช้งานบางอย่างใน Python เช่น Numpy, Jpython และ IronPytbhon. ไลบรารีเหล่านี้ทำงานโดยไม่มีการโต้ตอบใด ๆ กับ GIL