Python 3.7 belgeleri
Ayrıca Python threading
belgelerinden aşağıdaki alıntıyı vurgulamak istiyorum :
CPython uygulama ayrıntısı: CPython'da, Global Tercüman Kilidi nedeniyle, Python kodunu aynı anda yalnızca bir iş parçacığı yürütebilir (belirli performans odaklı kitaplıklar bu sınırlamanın üstesinden gelebilir). Uygulamanızın çok çekirdekli makinelerin hesaplama kaynaklarını daha iyi kullanmasını istiyorsanız multiprocessing
veya seçeneğini kullanmanız önerilir concurrent.futures.ProcessPoolExecutor
. Bununla birlikte, aynı anda birden fazla G / Ç bağlantılı görev çalıştırmak istiyorsanız, iş parçacığı oluşturma uygun bir modeldir.
Bu , GIL'in Python'daki dişli paralelliğin CPU'ya bağlı görevler için uygun olmadığını ima ettiği Sözlük girişineglobal interpreter lock
bağlantı verir :
CPython yorumlayıcısı tarafından aynı anda yalnızca bir iş parçacığının Python bayt kodunu yürütmesini sağlamak için kullanılan mekanizma. Bu, nesne modelini (dict gibi kritik yerleşik türler dahil) eşzamanlı erişime karşı örtük olarak güvenli hale getirerek CPython uygulamasını basitleştirir. Tüm yorumlayıcının kilitlenmesi, çok işlemcili makinelerin sağladığı paralelliklerin çoğunu pahasına yorumlayıcının çok iş parçacıklı olmasını kolaylaştırır.
Bununla birlikte, standart veya üçüncü taraf olan bazı genişletme modülleri, sıkıştırma veya karma gibi hesaplama açısından yoğun görevler yaparken GIL'i serbest bırakacak şekilde tasarlanmıştır. Ayrıca, I / O yaparken GIL daima serbest bırakılır.
"Serbest iş parçacıklı" bir yorumlayıcı (paylaşılan verileri çok daha hassas bir şekilde kilitleyen) oluşturma çabaları başarılı olmamıştır çünkü ortak tek işlemcili durumda performanstan etkilenmiştir. Bu performans sorununun üstesinden gelmenin, uygulamayı daha karmaşık ve dolayısıyla sürdürülmesi daha pahalı hale getireceğine inanılmaktadır.
Bu alıntı ayrıca diktelerin ve dolayısıyla değişken atamanın da CPython uygulama detayı olarak iş parçacığı açısından güvenli olduğunu ima eder:
Daha sonra , multiprocessing
pakete ilişkin dokümanlar, aşağıdakine benzer bir arayüz ortaya koyarken yumurtlama süreciyle GIL'in üstesinden nasıl geldiğini açıklar threading
:
çoklu işlem, iş parçacığı modülüne benzer bir API kullanarak yumurtlama işlemlerini destekleyen bir pakettir. Çok işlemli paket, hem yerel hem de uzak eşzamanlılık sunar ve iş parçacıkları yerine alt işlemler kullanarak Global Tercüman Kilidini etkin bir şekilde yönlendirir. Bu nedenle, çok işlem modülü, programlayıcının belirli bir makinede birden fazla işlemciden tam olarak yararlanmasına izin verir. Hem Unix hem de Windows üzerinde çalışır.
Ve dokümanlarconcurrent.futures.ProcessPoolExecutor
bunun multiprocessing
bir arka uç olarak kullandığını açıklıyor :
ProcessPoolExecutor sınıfı, çağrıları eşzamansız olarak yürütmek için bir işlem havuzunu kullanan bir Executor alt sınıfıdır. ProcessPoolExecutor, Global Tercüman Kilidi'nin yan basamağını sağlayan çoklu işlem modülünü kullanır, aynı zamanda yalnızca seçilebilir nesnelerin yürütülebileceği ve iade edilebileceği anlamına gelir.
Diğer bir temel sınıf tezat gereken işlemlerin yerine parçacıkları kullanırThreadPoolExecutor
ThreadPoolExecutor, çağrıları eşzamansız olarak yürütmek için bir iş parçacığı havuzu kullanan bir Executor alt sınıfıdır.
ThreadPoolExecutor
bundan yalnızca G / Ç bağlantılı görevler için uygun olduğu sonucuna varıyoruz.ProcessPoolExecutor
, aynı zamanda CPU bağlantılı görevleri de gerçekleştirebilir.
Aşağıdaki soru, GIL'in neden ilk sırada var olduğunu soruyor: Neden Global Tercüman Kilidi?
Proses ve iplik deneyleri
At Threading Python vs Multiprocessing Python içinde parçacığı vs sürecinin deneysel analizi yaptıktan.
Sonuçların hızlı önizlemesi: