หมายเหตุ: ทุกที่ที่ฉันพูดถึงthread
ฉันหมายถึงเฉพาะเธรดใน pythonจนกว่าจะระบุไว้อย่างชัดเจน
เธรดทำงานแตกต่างกันเล็กน้อยใน python หากคุณมาจาก C/C++
พื้นหลัง ใน python เธรดเดียวเท่านั้นที่สามารถอยู่ในสถานะรันในช่วงเวลาที่กำหนดซึ่งหมายความว่าเธรดในไพ ธ อนไม่สามารถใช้ประโยชน์จากพลังของคอร์ประมวลผลหลายคอร์ได้อย่างแท้จริงเนื่องจากการออกแบบเป็นไปไม่ได้ที่เธรดจะทำงานแบบขนานบนหลายคอร์
ในฐานะที่จัดการหน่วยความจำในหลามไม่ด้ายปลอดภัยแต่ละหัวข้อต้องมีสิทธิ์พิเศษในการโครงสร้างข้อมูลใน interpreter.This หลามสิทธิ์พิเศษที่ได้มาโดยกลไกที่เรียกว่า(ล็อค interpretr ทั่วโลก)GIL
Why does python use GIL?
เพื่อป้องกันไม่ให้เธรดจำนวนมากเข้าถึงสถานะตัวแปลพร้อมกันและทำให้สถานะล่ามเสียหาย
แนวคิดคือเมื่อใดก็ตามที่เธรดถูกเรียกใช้งาน(แม้ว่าจะเป็นเธรดหลักก็ตาม) GIL จะได้รับและหลังจากช่วงเวลาที่กำหนดไว้ล่วงหน้าบางช่วงเวลา GIL จะถูกปล่อยออกมาโดยเธรดปัจจุบันและเธรดอื่นได้รับกลับมาอีกครั้ง (ถ้ามี)
Why not simply remove GIL?
ไม่ใช่ว่ามันเป็นไปไม่ได้ที่จะลบ GIL มันเป็นเพียงแค่การทำเช่นนั้นเราจึงวางล็อคหลายตัวไว้ในล่ามเพื่อทำให้การเข้าถึงเป็นอนุกรมซึ่งทำให้แม้แต่แอปพลิเคชันเธรดเดียวก็มีประสิทธิภาพน้อยลง
ดังนั้นค่าใช้จ่ายในการลบ GIL จึงได้รับการจ่ายโดยประสิทธิภาพที่ลดลงของแอปพลิเคชันเธรดเดียวซึ่งไม่เป็นที่ต้องการ
So when does thread switching occurs in python?
เธรดสวิทช์เกิดขึ้นเมื่อปล่อย GIL ดังนั้น GIL จะถูกปล่อยเมื่อใด มีสองสถานการณ์ที่ต้องพิจารณา
หากเธรดกำลังดำเนินการกับ CPU Bound (Ex การประมวลผลภาพ)
ใน python เวอร์ชันเก่าการสลับเธรดเคยเกิดขึ้นหลังจากไม่มีคำสั่ง python คงที่โดยค่าเริ่มต้นถูกตั้งค่าเป็น100
ปรากฎว่าไม่ใช่นโยบายที่ดีมากในการตัดสินใจว่าควรสลับเมื่อใดเนื่องจากเวลาที่ใช้ในการดำเนินการคำสั่งเดียว ได้อย่างดุเดือดตั้งแต่มิลลิวินาทีถึงวินาทีดังนั้นปล่อย GIL ทุกครั้ง100
คำแนะนำโดยไม่คำนึงถึงเวลาที่ใช้ในการดำเนินการจึงเป็นนโยบายที่ไม่ดี
ในเวอร์ชันใหม่แทนที่จะใช้การนับคำสั่งเป็นเมตริกเพื่อสลับเธรดจะใช้ช่วงเวลาที่กำหนดค่าได้ สวิทช์ช่วงเริ่มต้นคือ 5 milliseconds.you sys.getswitchinterval()
จะได้รับช่วงเวลาที่สวิทช์ปัจจุบันใช้ สิ่งนี้สามารถเปลี่ยนแปลงได้โดยใช้sys.setswitchinterval()
หากเธรดกำลังดำเนินการ IO Bound Operations (การเข้าถึงระบบไฟล์ Ex หรือ
Network IO)
GIL จะถูกรีลีสเมื่อใดก็ตามที่เธรดกำลังรอให้การดำเนินการ IO เสร็จสมบูรณ์
Which thread to switch to next?
ล่ามไม่มีตัวกำหนดตารางเวลาของตัวเองเธรดใดจะถูกจัดกำหนดการเมื่อสิ้นสุดช่วงเวลาเป็นการตัดสินใจของระบบปฏิบัติการ .