Ada beberapa implementasi Python, misalnya, CPython, IronPython, RPython, dll.
Beberapa dari mereka memiliki GIL, beberapa tidak. Misalnya, CPython memiliki GIL:
Dari http://en.wikipedia.org/wiki/Global_Interpreter_Lock
Aplikasi yang ditulis dalam bahasa pemrograman dengan GIL dapat dirancang untuk menggunakan proses terpisah untuk mencapai paralelisme penuh, karena setiap proses memiliki penerjemah sendiri dan pada gilirannya memiliki GIL sendiri.
Manfaat GIL
- Peningkatan kecepatan program single-threaded.
- Integrasi yang mudah dari pustaka C yang biasanya tidak aman untuk thread.
Mengapa Python (CPython dan lainnya) menggunakan GIL
Dalam CPython, kunci juru bahasa global, atau GIL, adalah mutex yang mencegah beberapa utas asli dari mengeksekusi bytecodes Python sekaligus. Kunci ini diperlukan terutama karena manajemen memori CPython tidak aman untuk thread.
GIL kontroversial karena mencegah program CPython multithreaded dari mengambil keuntungan penuh dari sistem multiprosesor dalam situasi tertentu. Perhatikan bahwa operasi yang berpotensi memblokir atau berjalan lama, seperti I / O, pemrosesan gambar, dan pengerasan angka NumPy, terjadi di luar GIL. Oleh karena itu hanya dalam program multithreaded yang menghabiskan banyak waktu di dalam GIL, menafsirkan bytecode CPython, bahwa GIL menjadi hambatan.
Python memiliki GIL yang bertentangan dengan penguncian berbutir halus karena beberapa alasan:
Lebih cepat dalam kasing tunggal.
Lebih cepat dalam kasus multi-utas untuk program terikat i / o.
Lebih cepat dalam kasus multi-threaded untuk program cpu-terikat yang melakukan pekerjaan komputasi intensif di perpustakaan C.
Itu membuat ekstensi C lebih mudah untuk ditulis: tidak akan ada pengalihan utas Python kecuali jika Anda mengizinkannya (yaitu antara makro Py_BEGIN_ALLOW_THREADS dan Py_END_ALLOW_THREADS makro).
Itu membuat membungkus perpustakaan C lebih mudah. Anda tidak perlu khawatir tentang keamanan utas. Jika pustaka tidak aman thread, Anda cukup menjaga GIL terkunci saat Anda menyebutnya.
GIL dapat dirilis oleh ekstensi C. Pustaka standar Python melepaskan GIL di sekitar setiap panggilan i / o pemblokiran. Dengan demikian GIL tidak memiliki konsekuensi untuk kinerja server terikat i / o. Anda dapat membuat server jaringan di Python menggunakan proses (fork), utas atau i / o asinkron, dan GIL tidak akan menghalangi Anda.
Perpustakaan numerik di C atau Fortran juga dapat disebut dengan GIL yang dirilis. Sementara ekstensi C Anda menunggu FFT selesai, penerjemah akan mengeksekusi utas Python lainnya. Dengan demikian GIL lebih mudah dan lebih cepat daripada penguncian berbutir halus dalam kasus ini. Ini merupakan bagian terbesar dari pekerjaan numerik. Ekstensi NumPy melepaskan GIL bila memungkinkan.
Utas biasanya merupakan cara yang buruk untuk menulis sebagian besar program server. Jika beban rendah, forking lebih mudah. Jika bebannya tinggi, asynchronous i / o dan pemrograman berbasis acara (mis. Menggunakan Python's Twisted framework) lebih baik. Satu-satunya alasan untuk menggunakan utas adalah kurangnya os.fork di Windows.
GIL adalah masalah jika, dan hanya jika, Anda melakukan pekerjaan intensif CPU dengan Python murni. Di sini Anda bisa mendapatkan desain yang lebih bersih menggunakan proses dan penyampaian pesan (mis. Mpi4py). Ada juga modul 'pemrosesan' di toko keju Python, yang memberikan proses antarmuka yang sama seperti utas (yaitu ganti threading. Mulailah dengan pemrosesan. Proses).
Utas dapat digunakan untuk mempertahankan daya tanggap GUI terlepas dari GIL. Jika GIL merusak kinerja Anda (lih. Diskusi di atas), Anda dapat membiarkan utas Anda memunculkan proses dan menunggu sampai selesai.