Rumah >pembangunan bahagian belakang >Tutorial Python >Mod Berulir Percuma dalam PythonGIL dilumpuhkan)
Python 3.13 baru sahaja dikeluarkan baru-baru ini, dengan ciri baharu yang menakjubkan dipanggil "Mod berulir percuma". Ini adalah peningkatan yang hebat untuk prestasi kod anda apabila anda menggunakan benang. Artikel ini menunjukkan cara untuk mendayakan ciri ini (tidak didayakan secara lalai) dan menunjukkan kesan "mod belir bebas" pada prestasi kod anda.
Untuk pengguna Windows dan MacOS, cuma muat turun pemasang terbaharu daripada tapak web Python. Apabila anda memasang Python, terdapat kotak pilihan untuk mendayakan "Mod berulir percuma" apabila anda memilih pilihan "Sesuaikan pemasangan".
Untuk pengguna Ubuntu, anda boleh mendayakan ciri ini dengan menjalankan arahan berikut dalam terminal anda:
sudo add-apt-repository ppa:deadsnakes sudo apt-get update sudo apt-get install python3.13-nogil
Selepas memasang pakej, anda boleh menjalankan kod anda dengan python3.13 (asal) dan python3.13-nogil atau python3.13t (python3.13t percuma).
Lihat artikel ini untuk mendapatkan butiran lanjut tentang cara memasang eksperimen Python 3.13 pada distro Linux.
Untuk mengesahkan Python anda telah mendayakan "Mod berulir percuma", anda boleh menggunakan arahan berikut:
python3.13t -VV Python 3.13.0 experimental free-threading build (main, Oct 8 2024, 08:51:28) [GCC 11.4.0]
Mari kita lihat kesan mod berbenang percuma pada kod ringkas di bawah:
import sys import threading import time print("Python version : ", sys.version) def worker(): sum = 0 for i in range(10000000): sum += i n_worker = 5 # Single thread start = time.perf_counter() for i in range(n_worker): worker() print("Single Thread: ", time.perf_counter() - start, "seconds") # Multi thread start = time.perf_counter() threads = [] for i in range(n_worker): t = threading.Thread(target=worker) threads.append(t) t.start() for t in threads: t.join() print("Multi Thread: ", time.perf_counter() - start, "seconds")
Kemudian, saya akan menjalankan kod ini dengan Python biasa (python3.13 binary) dan Python thread percuma (pypy3.13t binary).
Pertama, jalankan ujian dengan python3.13:
python3.13 gil_test.py Python version : 3.13.0 (main, Oct 8 2024, 08:51:28) [GCC 11.4.0] Single Thread: 1.4370562601834536 seconds Multi Thread: 1.3681392602156848 seconds
Kemudian, jalankan ujian dengan pypy3.13t:
python3.13t gil_test.py Python version : 3.13.0 experimental free-threading build (main, Oct 8 2024, 08:51:28) [GCC 11.4.0] Single Thread: 1.862126287072897 seconds Multi Thread: 0.3931183419190347 seconds
Saya juga mencuba dengan python3.11:
python3.11 gil_test.py Python version : 3.11.3 (main, Apr 25 2023, 16:40:23) [GCC 11.3.0] Single Thread: 1.753435204969719 seconds Multi Thread: 1.457715731114149 seconds
Python lalai mempunyai mekanisme penguncian GIL (Global Interpreter Lock), menjadikan berbilang benang sebenarnya tidak selari. Anda boleh melihat masa pemprosesan satu utas adalah serupa dengan berbilang utas.
Dengan python3.11t (mod berulir percuma), prestasi berbilang benang jauh lebih pantas daripada berbenang tunggal. Jadi, pelbagai benang kini sebenarnya selari.
Tetapi, adakah anda melihat ujian Benang Tunggal dalam python3.13t sedikit lebih perlahan daripada pypy3.13?
Saya tidak begitu faham mengapa, jadi beritahu saya jika anda mempunyai sebarang penjelasan.
Saya fikir adalah baik untuk menggunakan multi threading dalam python untuk pemprosesan selari. Tetapi, tanpa mekanisme penguncian GIL, ia memerlukan pemaju untuk berhati-hati tentang "keselamatan benang", iaitu. berkongsi data antara urutan.
Selain itu, kita perlu menunggu kemas kini perpustakaan dan pakej untuk menyokong mod berbenang percuma sepenuhnya. Itulah salah satu sebab mengapa "mod berulir percuma" ini tidak didayakan secara lalai buat masa ini. Tetapi, saya fikir ia akan menjadi ciri yang baik pada masa hadapan.
Atas ialah kandungan terperinci Mod Berulir Percuma dalam PythonGIL dilumpuhkan). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!