Rumah >pembangunan bahagian belakang >Tutorial Python >Makmal GIL: Meneroka Sempadan Python Concurrency
Cara GIL berfungsi
GIL ialah mutex lock yang memastikan jurubahasa python hanya boleh melaksanakan satu benang pada masa yang sama. Ini kerana sistem pengurusan memori Python tidak selamat untuk benang Jika berbilang benang mengakses objek yang sama pada masa yang sama, ia boleh menyebabkan kerosakan data atau ranap program. GIL berfungsi dengan menjejaki utas yang sedang dilaksanakan. Apabila benang perlu mengakses objek yang dilindungi GIL, ia cuba mendapatkan GIL. Jika GIL sudah diduduki oleh benang lain, benang itu akan disekat sehingga GIL dilepaskan.
Sekatan GILWalaupun GIL boleh memastikan kestabilan penterjemah Python, ia juga mengehadkan keupayaan selari Python. Memandangkan hanya satu utas boleh dilaksanakan pada satu masa,
pelbagai benangpengaturcaraan menggunakan Python boleh menjadi sangat tidak cekap. Sebagai contoh, pertimbangkan kod berikut:
import threading import time def task(i): time.sleep(1) print(f"Task {i} completed") threads = [] for i in range(10): thread = threading.Thread(target=task, args=(i,)) threads.append(thread) for thread in threads: thread.start()
Kod ini mencipta 10 utas, setiap utas memanggil fungsi bernama
dan tidur selama 1 saat. Walau bagaimanapun, disebabkan oleh GIL, utas ini hanya boleh melaksanakan satu demi satu. Ini bermakna bahawa ia mengambil masa 10 saat untuk menyelesaikan semua 10 tugasan, walaupun ia boleh diselesaikan dalam satu saat dalam persekitaran selari.
task
Terdapat beberapa teknik yang boleh digunakan untuk mengatasi batasan GIL:
concurrent.futures
或 multiprocessing
Contoh berikut menunjukkan cara menggunakan pelbagai proses untuk mengatasi batasan GIL:
import multiprocessing import time def task(i): time.sleep(1) print(f"Task {i} completed") if __name__ == "__main__": processes = [] for i in range(10): process = multiprocessing.Process(target=task, args=(i,)) processes.append(process) for process in processes: process.start() for process in processes: process.join()
Kod ini mencipta 10 proses menggunakan modul berbilang proses. Setiap proses memanggil fungsi
dan tidur selama 1 saat. Oleh kerana proses dilaksanakan secara selari, kesemua 10 tugasan boleh diselesaikan dalam masa kurang dari satu saat.
task
GIL ialah ciri penting Python, yang memastikan kestabilan penterjemah. Walau bagaimanapun, ia juga mengehadkan keupayaan selari Python. Dengan memahami cara GIL berfungsi dan memanfaatkan teknik seperti pemproses berbilang, coroutine dan keluaran GIL, kami boleh mengatasi batasan ini dan meningkatkan prestasi aplikasi Python kami.
Atas ialah kandungan terperinci Makmal GIL: Meneroka Sempadan Python Concurrency. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!