มีการนำไปใช้งานหลายอย่างของ Python เช่น CPython, IronPython, RPython เป็นต้น
บางคนมี GIL แต่บางคนไม่มี ตัวอย่างเช่น CPython มี GIL:
จากhttp://en.wikipedia.org/wiki/Global_Interpreter_Lock
แอปพลิเคชันที่เขียนด้วยภาษาโปรแกรมด้วย GIL สามารถออกแบบให้ใช้กระบวนการแยกต่างหากเพื่อให้เกิดความขนานอย่างสมบูรณ์เนื่องจากแต่ละกระบวนการมีล่ามของตัวเองและในทางกลับกันก็มี GIL ของตัวเอง
ประโยชน์ของ GIL
- เพิ่มความเร็วของโปรแกรมแบบเธรดเดียว
- การรวมไลบรารี C ที่ง่ายซึ่งโดยทั่วไปจะไม่ปลอดภัยสำหรับเธรด
เหตุใด Python (CPython และอื่น ๆ ) จึงใช้ GIL
ใน CPython การล็อคตัวแปลภาษาทั่วโลกหรือ GIL เป็น mutex ที่ป้องกันไม่ให้เธรดหลายเธรดดำเนินการไพทอนของ Python พร้อมกัน การล็อกนี้เป็นสิ่งจำเป็นเนื่องจากการจัดการหน่วยความจำของ CPython ไม่ปลอดภัยสำหรับเธรด
GIL ขัดแย้งกันเนื่องจากป้องกันโปรแกรม CPython แบบมัลติเธรดจากการใช้ประโยชน์เต็มที่จากระบบมัลติโปรเซสเซอร์ในบางสถานการณ์ โปรดทราบว่าอาจมีการบล็อกหรือการทำงานที่ยาวนานเช่น I / O การประมวลผลภาพและการบีบอัดตัวเลข NumPy ซึ่งเกิดขึ้นนอก GIL ดังนั้นจึงมีเฉพาะในโปรแกรมแบบมัลติเธรดที่ใช้เวลาส่วนใหญ่ใน GIL ตีความ CPTC bytecode ว่า GIL กลายเป็นคอขวด
Python มี GIL ซึ่งต่างจากการล็อกแบบละเอียดด้วยเหตุผลหลายประการ:
มันเร็วกว่าในเคสแบบเธรดเดี่ยว
จะเร็วกว่าในกรณีแบบมัลติเธรดสำหรับโปรแกรมที่ถูกผูกไว้ของ i / o
มันเร็วกว่าในกรณีแบบมัลติเธรดสำหรับโปรแกรมที่เชื่อมโยงกับ cpu ซึ่งทำงานที่ต้องใช้การคำนวณอย่างมากในไลบรารี C
มันทำให้ส่วนขยาย C ง่ายต่อการเขียน: จะไม่มีสวิตช์ของเธรด Python ยกเว้นตำแหน่งที่คุณอนุญาตให้เกิดขึ้น (เช่นระหว่าง Py_BEGIN_ALLOW_THREADS และ Py_END_ALLOW_THREADS มาโคร)
มันทำให้การห่อ C ไลบรารีง่ายขึ้น คุณไม่ต้องกังวลกับหัวข้อความปลอดภัย หากไลบรารีไม่ปลอดภัยสำหรับเธรดคุณเพียงแค่ล็อค GIL ไว้ในขณะที่คุณเรียกมัน
GIL สามารถเผยแพร่โดยส่วนขยาย C ไลบรารี่มาตรฐานของ Python จะปล่อย GIL รอบ ๆ การบล็อกแต่ละครั้งที่ฉันโทรเข้า ดังนั้น GIL จึงไม่มีผลต่อประสิทธิภาพของเซิร์ฟเวอร์ที่เชื่อมโยงกับ i / o คุณสามารถสร้างเซิร์ฟเวอร์เครือข่ายใน Python โดยใช้โพรเซส (ทางแยก), เธรดหรืออะซิงโครนัส i / o, และ GIL จะไม่เข้าทางคุณ
ไลบรารีตัวเลขใน C หรือ Fortran สามารถถูกเรียกในทำนองเดียวกันเมื่อ GIL เผยแพร่ ในขณะที่ส่วนขยาย C ของคุณกำลังรอให้ FFT เสร็จสมบูรณ์ล่ามจะดำเนินการเธรด Python อื่น ๆ GIL นั้นง่ายกว่าและเร็วกว่าการล็อคแบบละเอียดในกรณีนี้เช่นกัน นี่ถือเป็นการทำงานที่เป็นตัวเลข ส่วนขยาย NumPy จะปล่อย GIL เมื่อทำได้
เธรดมักเป็นวิธีที่ไม่ดีในการเขียนโปรแกรมเซิร์ฟเวอร์ส่วนใหญ่ หากโหลดต่ำการฟอร์กก็จะง่ายขึ้น ถ้าโหลดสูงอะซิงโครนัส i / o และการเขียนโปรแกรมที่ขับเคลื่อนด้วยเหตุการณ์ (เช่นใช้เฟรมเวิร์ก Twisted Python) จะดีกว่า ข้อแก้ตัวสำหรับการใช้เธรดเท่านั้นคือการขาด os.fork บน Windows
GIL เป็นปัญหาหากและถ้าคุณกำลังทำงาน CPU-intensive ใน Python บริสุทธิ์ ที่นี่คุณสามารถออกแบบที่สะอาดขึ้นโดยใช้กระบวนการและการส่งข้อความ (เช่น mpi4py) นอกจากนี้ยังมีโมดูล 'การประมวลผล' ในร้านค้า Python cheese ที่ให้กระบวนการกับส่วนต่อประสานกับเธรด (เช่นแทนที่เธรดเธรดด้วยการประมวลผลกระบวนการ)
หัวข้อสามารถใช้เพื่อรักษาการตอบสนองของ GUI โดยไม่คำนึงถึง GIL หาก GIL ทำให้ประสิทธิภาพการทำงานของคุณแย่ลง (เช่นการสนทนาด้านบน) คุณสามารถปล่อยให้เธรดของคุณวางกระบวนการและรอให้กระบวนการเสร็จสิ้น