Not: Bahsettiğim her yerde , açıkça belirtilinceye kadar thread
özellikle python'daki konuları kastediyorum .
İplikler python'da biraz farklı çalışır. C/C++
Arka plandan . Python'da, belirli bir anda yalnızca bir iş parçacığı çalışır durumda olabilir. Bu, python'daki İş parçacığının birden fazla işlem çekirdeğinin gücünden gerçekten yararlanamayacağı anlamına gelir çünkü iş parçacıklarının birden çok çekirdekte paralel olarak çalışması mümkün değildir.
Python'daki bellek yönetimi iş parçacığı güvenli olmadığından, her iş parçacığı python yorumlayıcısındaki veri yapılarına özel erişim gerektirir. Bu özel erişim (global interpretr lock) adlı bir mekanizma tarafından elde edilir .GIL
Why does python use GIL?
Birden çok iş parçacığının aynı anda yorumlayıcı durumuna erişmesini ve yorumlayıcı durumunu bozmasını önlemek için.
Buradaki fikir, bir iş parçacığı çalıştırıldığında (ana iş parçacığı olsa bile) , bir GIL edinilir ve önceden tanımlanmış bir zaman aralığından sonra GIL geçerli iş parçacığı tarafından serbest bırakılır ve başka bir iş parçacığı tarafından yeniden alınır (varsa).
Why not simply remove GIL?
GIL'i kaldırmak imkansız değil, sadece bunu yapma pratiğinde, erişimi serileştirmek için yorumlayıcının içine çoklu kilitler koyuyoruz, bu da tek bir iş parçacıklı uygulamayı daha az performanslı hale getiriyor.
bu nedenle GIL'i kaldırmanın maliyeti, hiçbir zaman arzu edilmeyen tek bir iş parçacıklı uygulamanın düşük performansıyla karşılanır.
So when does thread switching occurs in python?
İş parçacığı anahtarı, GIL serbest bırakıldığında gerçekleşir.Peki GIL Ne Zaman Çıktı? Dikkate alınması gereken iki senaryo var.
Bir İş Parçacığı CPU Bağlı işlemler yapıyorsa (Ex görüntü işleme).
Python'un eski sürümlerinde, Thread anahtarlama, sabit no python talimatlarından sonra gerçekleşiyordu. Varsayılan olarak ayarlandı 100
. Tek bir talimatı yürütmek için harcanan zamandan beri geçişin ne zaman gerçekleşmesi gerektiğine karar vermek için çok iyi bir politika olmadığı ortaya çıktı. milisaniyeden bir saniyeye kadar çok çılgınca olabilir. Bu nedenle, GIL'i her 100
talimattan sonra, ne kadar sürede olursa olsun yayınlamak kötü bir ilkedir.
Yeni sürümlerde, iş parçacığını değiştirmek için bir ölçü olarak komut sayımı kullanmak yerine, yapılandırılabilir bir zaman aralığı kullanılır. Varsayılan anahtar aralığı 5 milisaniyedir sys.getswitchinterval()
. Kullanarak mevcut anahtar aralığını alabilirsiniz . Bu, kullanılarak değiştirilebilirsys.setswitchinterval()
Bir İş Parçacığı bazı GÇ Bağlı İşlemler yapıyorsa (Ex dosya sistemi erişimi veya
ağ GÇ)
İş parçacığı IO işleminin tamamlanmasını beklediğinde GIL serbest bırakılır.
Which thread to switch to next?
Yorumlayıcının kendi zamanlayıcısı yoktur. Aralığın sonunda hangi iş parçacığı programlanırsa işletim sisteminin kararıdır. .