เหตุใดจึงไม่มี GIL ใน Java Virtual Machine ทำไมไพ ธ อนถึงต้องการตัวแย่?


177

ฉันหวังว่าบางคนสามารถให้ข้อมูลเชิงลึกเกี่ยวกับสิ่งที่แตกต่างกันโดยพื้นฐานเกี่ยวกับ Java Virtual Machine ที่อนุญาตให้ใช้เธรดได้อย่างดีโดยไม่จำเป็นต้องใช้ Global Interpreter Lock (GIL) ในขณะที่ Python จำเป็นต้องมีความชั่วร้าย

คำตอบ:


223

Python (ภาษา) ไม่ต้องการ GIL (ซึ่งเป็นเหตุผลว่าทำไมจึงสามารถนำไปใช้อย่างสมบูรณ์แบบใน JVM [Jython] และ. NET [IronPython] และการใช้งานเหล่านั้นแบบมัลติเธรดอย่างอิสระ) CPython (การใช้งานที่เป็นที่นิยม) มักใช้ GIL เพื่อความสะดวกในการเขียนโค้ด (โดยเฉพาะการเข้ารหัสกลไกการรวบรวมขยะ) และการรวมเข้ากับไลบรารี่ของ C-coded ที่ไม่ปลอดภัยต่อเธรด (เคยมีอยู่รอบ ๆ -)

โครงการUnladen Swallowท่ามกลางเป้าหมายที่ท้าทายอื่น ๆ ได้วางแผนเครื่องเสมือนที่ปราศจาก GIL สำหรับ Python - เพื่ออ้างถึงเว็บไซต์นั้น "นอกจากนี้เราตั้งใจที่จะลบ GIL และแก้ไขสถานะของมัลติเธรดใน Python เราเชื่อว่านี่เป็น เป็นไปได้ผ่านการใช้งานระบบ GC ที่มีความซับซ้อนมากขึ้นเช่น Recycler ของ IBM (Bacon et al, 2001)


6
อเล็กซ์แล้วความพยายามแบบเก่าในการลบ GIL ไม่ได้มีค่าใช้จ่ายจำนวนมาก (นั่นคือสิ่งที่ฉันจำได้ 2 ปัจจัย)
Bartosz Radaczyński

10
ใช่ Bartosz, Greg Stein ทำการวัดในปี 1999 การรวบรวมขยะโดยการนับการอ้างอิงคือนักฆ่าบังคับให้ล็อคเม็ดเล็กละเอียด นั่นเป็นเหตุผลที่ GC ขั้นสูงกว่ามีความสำคัญ
Alex Martelli

80
ทีม Unladen Swallow เลิกใช้งานการลบ GIL: code.google.com/p/unladen-swallow/wiki/…
Seun Osewa

1
ทางเลือกของ Unladen และ CPython คือ PyPy, Jython และ IronPython สองหลังไม่มี GIL แต่การใช้โมดูลมัลติโพรเซสจะก้าวไปข้างหน้า GIL และปลอดภัยกว่าอยู่ดี
Cees Timmerman

50

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)


7

มีความคิดเห็นด้านล่างในบล็อกโพสต์นี้http://www.grouplens.org/node/244ซึ่งบอกเหตุผลว่าทำไมการจ่ายยาด้วย GIL สำหรับ IronPython หรือ Jython นั้นง่ายมากเพราะ CPython ใช้การนับการอ้างอิงในขณะที่ อีก 2 VMs มีตัวรวบรวมขยะ

กลไกที่แน่นอนว่าทำไมถึงเป็นเช่นนั้นฉันจึงไม่ได้รับ แต่มันฟังดูเหมือนเหตุผลที่เป็นไปได้


5
เมื่อคุณแบ่งวัตถุระหว่างเธรดอย่างเด่นชัดการออกกำลังเมื่อไม่มีใครมีการอ้างอิงถึงวัตถุใด ๆ อีกต่อไปจะค่อนข้างอึดอัดปานกลาง การนับการอ้างอิงด้วยการล็อกส่วนกลางเป็นวิธีหนึ่ง (แพง) วิธีที่แตกต่างในการแก้ปัญหานั้นคือการปล่อยให้เธรดหนึ่งเธรดในแต่ละครั้งมีการอ้างอิงไปยังอ็อบเจกต์ซึ่งจะทำให้กิจกรรมส่วนใหญ่เป็นเธรดแบบโลคอลที่ค่าใช้จ่ายในการสื่อสารระหว่างเธรด โดยส่วนตัวแล้วฉันคิดว่ามันกำลังบอกว่า HPC ใช้การส่งข้อความระหว่างโปรเซสเซอร์และไม่ใช้หน่วยความจำร่วมกันและมันก็ทำเช่นนั้นด้วยเหตุผลด้านความสามารถในการปรับขยาย ...
Donal Fellows

0

ในลิงค์นี้พวกเขามีคำอธิบายต่อไปนี้:

... "ส่วนต่าง ๆ ของล่ามไม่ใช่เธรดที่ปลอดภัย แต่ส่วนใหญ่เป็นเพราะการทำให้เธรดทั้งหมดด้วยการใช้การล็อกขนาดใหญ่จะทำให้เธรดเดี่ยวช้ามาก (ที่มา ) ดูเหมือนว่าจะเกี่ยวข้องกับตัวรวบรวมขยะ CPython โดยใช้การนับการอ้างอิง (JVM และ CLR ไม่ต้องและดังนั้นจึงไม่จำเป็นต้องล็อค / ปล่อยจำนวนการอ้างอิงทุกครั้ง) แต่ถึงแม้ว่าใครบางคนคิดว่าวิธีการแก้ปัญหาที่ยอมรับได้และนำไปใช้จริงห้องสมุดของบุคคลที่สามก็ยังคงมีปัญหาเดียวกันอยู่ "


-1

Python ไม่มี jit / aot และกรอบเวลาที่เขียนไว้ในโปรเซสเซอร์แบบมัลติเธรดไม่มีอยู่ หรือคุณสามารถคอมไพล์ทุกอย่างใหม่ใน Julia lang ที่ขาด GIL และเพิ่มความเร็วในโค้ด Python ของคุณ นอกจากนี้ชนิดของ Jython ก็จะช้ากว่า Cpython และ Java หากคุณต้องการยึดติดกับ Python ให้พิจารณาใช้ปลั๊กอินแบบขนานคุณจะไม่ได้รับความเร็วเพิ่ม แต่คุณสามารถทำการเขียนโปรแกรมแบบขนานด้วยปลั๊กอินที่เหมาะสม


แล้ว PyPy ล่ะ?
denis631
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.