Mengapa tidak ada GIL di Java Virtual Machine? Mengapa Python sangat membutuhkannya?


177

Saya berharap seseorang dapat memberikan beberapa wawasan tentang apa yang secara mendasar berbeda tentang Java Virtual Machine yang memungkinkannya untuk mengimplementasikan utas dengan baik tanpa perlu Kunci Penerjemah Global (GIL), sementara Python mengharuskan kejahatan semacam itu.

Jawaban:


223

Python (bahasa) tidak memerlukan GIL (itulah sebabnya ia dapat dengan sempurna diimplementasikan pada JVM [Jython] dan .NET [IronPython], dan implementasi tersebut multithread secara bebas). CPython (implementasi yang populer) selalu menggunakan GIL untuk kemudahan pengkodean (terutama pengkodean mekanisme pengumpulan sampah) dan integrasi perpustakaan kode-C yang tidak aman untuk thread-code (dulu ada satu ton dari yang ada di sekitar; -).

Proyek Unladen Swallow , di antara tujuan ambisius lainnya, memang merencanakan mesin virtual bebas-GIL untuk Python - mengutip situs itu, "Selain itu, kami bermaksud untuk menghapus GIL dan memperbaiki keadaan multithreading dengan Python. Kami percaya ini adalah mungkin melalui penerapan sistem GC yang lebih canggih, sesuatu seperti IBM Recycler (Bacon et al, 2001). "


6
Alex, bagaimana dengan upaya lama untuk menghapus GIL, bukankah ada satu ton overhead dengan itu (faktor 2 adalah apa yang saya ingat)?
Bartosz Radaczyński

10
Ya Bartosz, Greg Stein benar-benar mengukur hal itu pada tahun 1999. Pengumpulan sampah dengan penghitungan referensi adalah pembunuhnya, memaksa overhead besar dari penguncian berbutir halus. Itu sebabnya GC yang lebih maju sangat penting di sana.
Alex Martelli

80
Tim Unladen Swallow telah menyerah untuk menghapus GIL: code.google.com/p/unladen-swallow/wiki/…
Seun Osewa

1
Alternatif untuk Unladen dan CPython adalah PyPy, Jython, dan IronPython. Dua yang terakhir tidak memiliki GIL, tetapi menggunakan modul multiprosesing menghindari GIL dan lebih aman pula.
Cees Timmerman

50

JVM (setidaknya hotspot) memang memiliki konsep yang mirip dengan "GIL", itu hanya jauh lebih baik dalam granularity kunci, sebagian besar berasal dari GC di hotspot yang lebih maju.

Dalam CPython itu satu kunci besar (mungkin tidak benar, tetapi cukup baik untuk argumen), di JVM itu lebih menyebar tentang dengan konsep yang berbeda tergantung di mana ia digunakan.

Lihatlah, misalnya, vm / runtime / safepoint.hpp dalam kode hotspot, yang secara efektif merupakan penghalang. Setelah di safepoint seluruh VM telah berhenti berkaitan dengan kode java, seperti VM python berhenti di GIL.

Di dunia Jawa peristiwa VM seperti itu dikenal sebagai "stop-the-world", pada titik-titik ini hanya kode asli yang terikat pada kriteria tertentu yang berjalan bebas, dan sisanya dari VM telah dihentikan.

Juga kurangnya kunci kasar di java membuat JNI jauh lebih sulit untuk menulis, karena JVM membuat lebih sedikit jaminan tentang lingkungannya untuk panggilan FFI, salah satu hal yang cpython buat cukup mudah (walaupun tidak semudah menggunakan ctypes).


7

Ada komentar di bawah ini di posting blog ini http://www.grouplens.org/node/244 yang mengisyaratkan alasan mengapa mudah sekali mengeluarkan GIL untuk IronPython atau Jython, karena CPython menggunakan penghitungan referensi sedangkan 2 VM lainnya memiliki pemulung.

Mekanisme persisnya mengapa ini tidak saya dapatkan, tetapi itu terdengar seperti alasan yang masuk akal.


5
Saat Anda berbagi benda secara acak di antara utas, berolahraga ketika tidak ada yang memiliki referensi ke objek tertentu lagi cukup canggung. Penghitungan referensi dengan kunci global adalah satu cara (mahal). Cara berbeda untuk menyelesaikannya adalah dengan membiarkan satu utas pada satu waktu memegang referensi ke objek, yang akan membuat sebagian besar aktivitas menjadi utas-lokal dengan biaya membuat komunikasi antar-utas lebih canggung. Secara pribadi, saya pikir itu memberitahu bahwa HPC menggunakan pesan-lewat antara prosesor dan tidak berbagi memori, dan itu melakukannya untuk alasan skalabilitas ...
Donal Fellows

0

Di tautan ini mereka memiliki penjelasan berikut:

... "Bagian dari Penerjemah bukan threadsafe, meskipun sebagian besar karena menjadikannya semua threadsafe dengan penggunaan kunci besar akan memperlambat single-threaded sangat ( sumber ). Ini tampaknya terkait dengan pengumpul sampah CPython menggunakan penghitungan referensi (JVM dan CLR tidak, dan karena itu tidak perlu mengunci / merilis penghitungan referensi setiap waktu). Tetapi bahkan jika seseorang memikirkan solusi yang dapat diterima dan mengimplementasikannya, perpustakaan pihak ketiga masih akan memiliki masalah yang sama. "


-1

Python tidak memiliki jit / aot dan kerangka waktu yang ditulis di prosesor multithreaded tidak ada. Atau Anda dapat mengkompilasi ulang semua yang ada di Julia lang yang tidak memiliki GIL dan meningkatkan kecepatan pada kode Python Anda. Jenis Jython juga menyebalkan lebih lambat dari Cpython dan Java. Jika Anda ingin tetap menggunakan Python pertimbangkan untuk menggunakan plugin paralel, Anda tidak akan mendapatkan peningkatan kecepatan instan tetapi Anda dapat melakukan pemrograman paralel dengan plugin yang tepat.


bagaimana dengan PyPy?
denis631
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.