ฉันหวังว่าบางคนสามารถให้ข้อมูลเชิงลึกเกี่ยวกับสิ่งที่แตกต่างกันโดยพื้นฐานเกี่ยวกับ Java Virtual Machine ที่อนุญาตให้ใช้เธรดได้อย่างดีโดยไม่จำเป็นต้องใช้ Global Interpreter Lock (GIL) ในขณะที่ Python จำเป็นต้องมีความชั่วร้าย
ฉันหวังว่าบางคนสามารถให้ข้อมูลเชิงลึกเกี่ยวกับสิ่งที่แตกต่างกันโดยพื้นฐานเกี่ยวกับ Java Virtual Machine ที่อนุญาตให้ใช้เธรดได้อย่างดีโดยไม่จำเป็นต้องใช้ Global Interpreter Lock (GIL) ในขณะที่ Python จำเป็นต้องมีความชั่วร้าย
คำตอบ:
Python (ภาษา) ไม่ต้องการ GIL (ซึ่งเป็นเหตุผลว่าทำไมจึงสามารถนำไปใช้อย่างสมบูรณ์แบบใน JVM [Jython] และ. NET [IronPython] และการใช้งานเหล่านั้นแบบมัลติเธรดอย่างอิสระ) CPython (การใช้งานที่เป็นที่นิยม) มักใช้ GIL เพื่อความสะดวกในการเขียนโค้ด (โดยเฉพาะการเข้ารหัสกลไกการรวบรวมขยะ) และการรวมเข้ากับไลบรารี่ของ C-coded ที่ไม่ปลอดภัยต่อเธรด (เคยมีอยู่รอบ ๆ -)
โครงการUnladen Swallowท่ามกลางเป้าหมายที่ท้าทายอื่น ๆ ได้วางแผนเครื่องเสมือนที่ปราศจาก GIL สำหรับ Python - เพื่ออ้างถึงเว็บไซต์นั้น "นอกจากนี้เราตั้งใจที่จะลบ GIL และแก้ไขสถานะของมัลติเธรดใน Python เราเชื่อว่านี่เป็น เป็นไปได้ผ่านการใช้งานระบบ GC ที่มีความซับซ้อนมากขึ้นเช่น Recycler ของ IBM (Bacon et al, 2001)
JVM (ฮอตสปอตอย่างน้อย) มีแนวคิดที่คล้ายคลึงกับ "GIL" มันมีความละเอียดมากในเม็ดเล็ก ๆ ของล็อคซึ่งส่วนใหญ่มาจาก GC ในฮอตสปอตซึ่งสูงกว่า
ใน CPython เป็นหนึ่งในล็อคขนาดใหญ่ (อาจไม่จริง แต่ก็ดีพอสำหรับการโต้แย้ง) ใน JVM มันแพร่กระจายมากขึ้นเกี่ยวกับแนวคิดที่แตกต่างกันขึ้นอยู่กับที่ใช้
ลองดูที่ตัวอย่างเช่น vm / runtime / safepoint.hpp ในรหัสฮอตสปอตซึ่งเป็นอุปสรรคอย่างมีประสิทธิภาพ ครั้งหนึ่งที่ Safepoint VM ทั้งหมดได้หยุดการทำงานเกี่ยวกับโค้ดจาวาเหมือนกับว่า Python VM หยุดที่ GIL
ในโลก Java เหตุการณ์ VM หยุดชั่วคราวเช่นนี้รู้จักกันในชื่อ "stop-the-world" ณ จุดเหล่านี้เฉพาะโค้ดเนทีฟที่เชื่อมโยงกับเกณฑ์บางอย่างเท่านั้นที่กำลังทำงานอยู่ฟรีส่วนที่เหลือของ VM ก็หยุดทำงาน
การขาดการล็อคหยาบในจาวาทำให้ JNI ยากต่อการเขียนมากขึ้นเนื่องจาก JVM ทำให้การรับประกันน้อยลงเกี่ยวกับสภาพแวดล้อมสำหรับการโทร FFI ซึ่งเป็นหนึ่งในสิ่งที่ cpython ทำให้ค่อนข้างง่าย (แม้ว่าจะไม่ง่ายเหมือนกับการใช้ ctypes)
มีความคิดเห็นด้านล่างในบล็อกโพสต์นี้http://www.grouplens.org/node/244ซึ่งบอกเหตุผลว่าทำไมการจ่ายยาด้วย GIL สำหรับ IronPython หรือ Jython นั้นง่ายมากเพราะ CPython ใช้การนับการอ้างอิงในขณะที่ อีก 2 VMs มีตัวรวบรวมขยะ
กลไกที่แน่นอนว่าทำไมถึงเป็นเช่นนั้นฉันจึงไม่ได้รับ แต่มันฟังดูเหมือนเหตุผลที่เป็นไปได้
ในลิงค์นี้พวกเขามีคำอธิบายต่อไปนี้:
... "ส่วนต่าง ๆ ของล่ามไม่ใช่เธรดที่ปลอดภัย แต่ส่วนใหญ่เป็นเพราะการทำให้เธรดทั้งหมดด้วยการใช้การล็อกขนาดใหญ่จะทำให้เธรดเดี่ยวช้ามาก (ที่มา ) ดูเหมือนว่าจะเกี่ยวข้องกับตัวรวบรวมขยะ CPython โดยใช้การนับการอ้างอิง (JVM และ CLR ไม่ต้องและดังนั้นจึงไม่จำเป็นต้องล็อค / ปล่อยจำนวนการอ้างอิงทุกครั้ง) แต่ถึงแม้ว่าใครบางคนคิดว่าวิธีการแก้ปัญหาที่ยอมรับได้และนำไปใช้จริงห้องสมุดของบุคคลที่สามก็ยังคงมีปัญหาเดียวกันอยู่ "
Python ไม่มี jit / aot และกรอบเวลาที่เขียนไว้ในโปรเซสเซอร์แบบมัลติเธรดไม่มีอยู่ หรือคุณสามารถคอมไพล์ทุกอย่างใหม่ใน Julia lang ที่ขาด GIL และเพิ่มความเร็วในโค้ด Python ของคุณ นอกจากนี้ชนิดของ Jython ก็จะช้ากว่า Cpython และ Java หากคุณต้องการยึดติดกับ Python ให้พิจารณาใช้ปลั๊กอินแบบขนานคุณจะไม่ได้รับความเร็วเพิ่ม แต่คุณสามารถทำการเขียนโปรแกรมแบบขนานด้วยปลั๊กอินที่เหมาะสม