Rumah > Artikel > pembangunan bahagian belakang > Bermula dengan Python GIL: Cara memahami dan menggunakan kunci penterjemah global
Apa itu GIL?
GIL ialah singkatan penterjemah global lock, yang merupakan konsep penting jurubahasa python. GIL memastikan bahawa jurubahasa Python hanya boleh melaksanakan satu benang pada satu masa. Ini bermakna pada bila-bila masa, hanya satu utas boleh menjalankan kod bait Python. Benang lain mesti menunggu GIL tersedia sebelum meneruskan pelaksanaan.
Bagaimana GIL berfungsi?
GIL ialah kunci yang ditulis dalam bahasa C dan ia hidup dalam penterjemah Python. Apabila benang ingin melaksanakan kod bait Python, ia mesti mendapatkan GIL terlebih dahulu. Jika GIL sudah dipegang oleh benang lain, benang itu mesti menunggu GIL tersedia sebelum meneruskan pelaksanaan.
Apakah kesan GIL terhadap program Python?
Impak GIL pada program Python adalah pelbagai. Pertama, ia menghalang program Python daripada memanfaatkan sepenuhnya CPU berbilang teras dalam persekitaran berbilang benang. Ini kerana GIL memastikan bahawa hanya satu utas boleh melaksanakan kod bait Python pada masa yang sama, yang bermaksud bahawa utas lain mesti menunggu GIL tersedia sebelum meneruskan pelaksanaan.
Kedua, GIL menjadikan program Python terdedah kepada kebuntuan dalam situasi tertentu. Sebagai contoh, jika satu benang memegang GIL dan menunggu benang lain melepaskan kunci, dan benang lain memegang kunci dan menunggu GIL tersedia, maka kedua-dua benang akan terperangkap dalam kebuntuan.
Bagaimana untuk memahami dan menggunakan GIL?
Untuk memahami dan menggunakan GIL, anda perlu memahami bagaimana GIL berfungsi. Seperti yang dinyatakan di atas, GIL ialah kunci yang ditulis dalam C dan terletak dalam penterjemah Python. Apabila benang ingin melaksanakan kod bait Python, ia mesti mendapatkan GIL terlebih dahulu. Jika GIL sudah dipegang oleh benang lain, benang itu mesti menunggu GIL tersedia sebelum meneruskan pelaksanaan.
Kedua, anda perlu memahami kesan GIL pada program Python. Kesan GIL pada program Python adalah pelbagai. Pertama, ia menghalang program Python daripada memanfaatkan sepenuhnya CPU berbilang teras dalam persekitaran berbilang benang. Ini kerana GIL memastikan bahawa hanya satu utas boleh melaksanakan kod bait Python pada masa yang sama, yang bermaksud bahawa utas lain mesti menunggu GIL tersedia sebelum meneruskan pelaksanaan.
Kedua, GIL menjadikan program Python terdedah kepada kebuntuan dalam situasi tertentu. Sebagai contoh, jika satu benang memegang GIL dan menunggu benang lain melepaskan kunci, dan benang lain memegang kunci dan menunggu GIL tersedia, maka kedua-dua benang akan terperangkap dalam kebuntuan.
Untuk mengelakkan kesan negatif GIL pada program Python, anda boleh mengambil langkah berikut:
Kod demo:
import threading def task(): print("This is a task.") def main(): threads = [] for i in range(10): thread = threading.Thread(target=task) threads.append(thread) for thread in threads: thread.start() for thread in threads: thread.join() if __name__ == "__main__": main()
Kod ini mencipta 10 utas, setiap utas akan melaksanakan fungsi tugas. Fungsi tugas mencetak mesej. Fungsi utama mula-mula mencipta 10 utas dan kemudian memulakannya. Akhirnya, fungsi utama menunggu semua utas selesai dilaksanakan.
Apabila menjalankan kod ini, GIL akan memastikan bahawa hanya satu utas melaksanakan fungsi tugasan pada masa yang sama. Ini bermakna bahawa utas lain mesti menunggu GIL tersedia sebelum mereka boleh meneruskan pelaksanaan.
GILSateSave() dan GILStateRestore() fungsi
Fungsi GILStateSave() dan GILStateRestore() boleh digunakan untuk melepaskan GIL buat sementara waktu. Ini berguna untuk operasi tertentu yang mengambil masa yang lama untuk dilaksanakan, seperti operasi I/O. Fungsi GILStateSave() boleh menyimpan keadaan GIL semasa, dan fungsi GILStateRestore() boleh memulihkan keadaan GIL yang disimpan.
Contoh berikut menunjukkan cara menggunakan fungsi GILStateSave() dan GILStateRestore():
import threading def task(): print("This is a task.") def main(): threads = [] for i in range(10): thread = threading.Thread(target=task) threads.append(thread) for thread in threads: thread.start() with GILStateSave(): # PerfORM an operation that does not require the GIL. for thread in threads: thread.join() if __name__ == "__main__": main()
Kod ini serupa dengan kod sebelumnya, tetapi ia menggunakan fungsi GILStateSave() dan GILStateRestore() untuk melepaskan GIL buat sementara waktu. Ini membolehkan operasi yang tidak memerlukan GIL dilakukan semasa utas lain sedang dilaksanakan.
Atas ialah kandungan terperinci Bermula dengan Python GIL: Cara memahami dan menggunakan kunci penterjemah global. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!