Yin Libo: Python küresel yorumlayıcı kilidi ve eşzamanlılık AI Araştırma Topluluğu 59. Maymun Masa Toplantısı

Leifeng.com AI Technology Review Press: En popüler ve en hızlı büyüyen programlama dillerinden biri olan Python, çok amaçlı, üst düzey, nesne yönelimli, etkileşimli, yorumlanmış ve kullanıcı dostu bir programlamadır. Dil mükemmel okunabilirliğe ve yüksek derecede özgürlüğe sahiptir. Çok çekirdekli ve çoklu iş parçacığı avantajlarından yararlanmak için, iş parçacıkları arasında veri bütünlüğü ve durum senkronizasyonu sağlarken, Python'un resmi ve en yaygın kullanılan yorumlayıcı-CPython genellikle en basit kilitleme yöntemini kullanır. Global Tercüman Kilidi (GIL).

Bununla birlikte, GIL'in tasarımı bazen garip ve verimsiz görünebilir ve dilin eşzamanlılığını ciddi şekilde kısıtlayabilir.Ancak şu anda, yerleşik kitaplıklar ve üçüncü taraf kitaplıklar GIL'e büyük bir bağımlılık oluşturduğundan, GIL'i değiştirmek zorlaşır. . Ama aslında, Python ekosisteminde bu sorunu çözebilecek birçok araç var.

Son zamanlarda Avustralya Ulusal Üniversitesi'nden mezun olan Libo Yin, açık bir Leifeng sınıfında eşzamanlılığı geliştirmek için Küresel Tercüman Kilidini (GIL) ve farklı fikirleri tanıttı. Açık sınıfın tekrar videosunun URL'si: = aitechtalkyinlibo

Yin Libo: Batı Avustralya Üniversitesi ve Avustralya Ulusal Üniversitesi'nden mezun oldu. Şimdi, Canberra'daki Seeing Machines'de veri analisti olarak, büyük miktarda zaman serisi verilerini yönetmek, analiz etmek ve görselleştirmek için Python veri araçlarını kullanıyor.

Konuyu paylaş: Python global yorumlayıcı kilidi ve eşzamanlılık

Ana hatları paylaşın:

1. Global Tercüman Kilidi (GIL)

2. Çoklu işlem

3. Çok iş parçacıklı okuma

4. Eşzamansız (eşzamansız)

5. Dağıtılmış bilgi işlem (örnek olarak Dask'ı alın)

Leifeng.com AI Araştırma Enstitüsü paylaşım içeriğini şu şekilde düzenler:

Bugün sizinle Python global yorumlayıcı kilidini ve eşzamanlılığı paylaşmak istiyorum. Önce Global Yorumlayıcı Kilidi (GIL) kavramını ve etkisini tanıtacağım; ardından Python'un çok işlemli, çok iş parçacıklı, eşzamansız ve dağıtılmış hesaplama yoluyla nasıl eşzamanlılık elde edebileceğini göstermek için birkaç vaka çalışması kullanacağım; Bir dizi dağıtılmış bilgi işlem aracı tanıtacak - Dask.

Global Tercüman Kilidi (GIL)

GIL kavramı basit bir cümleyle açıklanır, yani "Tek bir CPython yorumlayıcısı, iş parçacığı sayısına bakılmaksızın herhangi bir zamanda yalnızca bir bayt kodunu çalıştırabilir." Bu tanımda dikkat edilmesi gereken noktalar şunları içerir:

İlk olarak, GIL Python dil tanımına ait değildir, ancak CPython yorumlayıcısının uygulanmasının bir parçasıdır;

İkinci olarak, diğer Python yorumlayıcılarında mutlaka GIL bulunmaz. Örneğin, Jython (JVM) ve IronPython (CLR) GIL'e sahip değilken, PyPy'de GIL vardır;

Üçüncüsü, GIL bir Python patenti değildir. GIL ayrıca diğer dillerde, özellikle Ruby MRI gibi dinamik dillerde de mevcuttur.

GIL'den bahsetmişken, aşağıdaki gibi çalışan Python iş parçacığı modelinden bahsetmelisiniz:

  • CPython, işletim sistemi yerel iş parçacıklarını kullanır ve işletim sistemi planlamadan sorumludur;

  • Her yorumlayıcı işleminin benzersiz bir ana dizisi ve herhangi bir sayıda kullanıcı tanımlı alt dizisi vardır;

  • GIL, bayt kodu seviyesinde bir muteks kilittir. Az önce tanımda bahsedilen PyThread_type_lock, OS mutex kilidinin takma adıdır

  • Her tercüman işleminin bir ve yalnızca bir kilidi vardır;

  • Yorumlayıcı başladığında, ana iş parçacığı GIL'i alır;

  • Bir iş parçacığı GIL tutarken ve bayt kodunu yürütürken, diğer iş parçacıkları bloke edilir.

GIL, CPython yorumlayıcısına bir nedenle eklenmiştir. 1992'de tek bir CPU makul bir varsayımdı! Çok çekirdek yalnızca 2005-2006 civarında popüler hale geldi. Ek olarak, GIL'in avantajları şunları içerir:

  • Tercüman uygulamasını basitleştirin;

  • Tek işlem performansını optimize edin;

  • C uzantı kitaplıklarının entegrasyonunu basitleştirin.

Python'un iki çok görevli modeli vardır: biri işbirlikli çoklu görev, diğeri ise önleyici çoklu görev olarak adlandırılır.

İşbirliğine dayalı çoklu görev:

  • GIL'i aktif olarak G / Ç'den önce serbest bırakın ve G / Ç'den sonra yeniden alın. Bu, Py_BEGIN_ALLOW_THREADS / Py_END_ALLOW_THREADS makrosu kullanılarak C kaynak kodunda uygulanabilir

  • Bu çoklu görev yaklaşımı kod performansını artırabilir!

Önleyici çoklu görev:

  • Etkin süreçleri aralıklı olarak askıya alın ve yeniden planlamak için işletim sistemine verin

  • Python 2: Her 100 bayt kod çalıştırıldığında, mevcut işlem askıya alınacaktır.

  • Python 3.2+: 5 milisaniyede bir

  • Bu çoklu görev yöntemi kod performansını iyileştirmez, ancak aynı zaman diliminde birden fazla görevin yürütülmesine izin verir

Bir sonraki adım GIL'i çıkarmak olabilir. Bu, birçok Python kullanıcısının dört gözle beklediği bir şeydir, ancak kısa vadede başarılması pek olası değildir. Zorlukları şunları içerir:

İlk olarak, teknik sorunlar

  • Guido, tek iş parçacıklı yürütme verimliliğini azaltmamayı gerektirir

  • Mevcut referans sayma ve çöp toplama mekanizmalarıyla uyumludur

  • Mevcut C uzantılarıyla uyumlu

İkincisi, topluluk dostu olma açısından, geliştirme zorluğunu önemli ölçüde artırmaz.

Bununla birlikte, GIL'i kaldırmak için bazı mevcut deneysel şemaları da görebiliriz:

  • Gilektomi: GIL'i birkaç küçük kilitle değiştirmeyi deneyin, ancak bu çözüm Python'un performansını ciddi şekilde düşürür. Birincisi, birden fazla iş parçacığının aynı kilit için rekabet etmesine neden olacaktır. İkinci olarak, GIL'i birkaç küçük kilitle değiştirdikten sonra önbellek isabet oranını ciddi şekilde azaltacaktır.

  • PyPy: Deneysel dal, yazılım işlem belleğini (STM) desteklemektedir, ancak STM halen birçok mevcut sorunu çözebilen nispeten nadir bir mekanizmadır, ancak özellikle Python gibi oldukça dinamik bir dilde uygulanması çok zordur.

  • Starlark: Bu çözüm GIL'i kaldırmak değil, bazı Python sözdizimiyle uyumlu ve aynı anda bayt kodunu çalıştıran yeni bir dildir. Şu anda Google Bazel derleme sisteminde kullanılıyor ve ben şahsen bunun çok ilginç bir gelecek trendi olduğunu düşünüyorum.

Mevcut GIL kaldırma programının birçok dezavantajı olduğundan ve GIL'i kısa vadede Python'dan kaldıramadığımız için, en yaygın çözümümüz GIL'den kaçınmaktır, bu temelde iki yolla gerçekleştirilir:

Birincisi, çoklu yorumlayıcı süreç eşzamanlılığıdır (çoklu işlem)

İkincisi, Python bayt kodunu çalıştırmaktan kaçınmaktır. Yaygın yöntemler şunlardır: Cython ctype, bazı NumPy fonksiyonları GIL, Numba JIT "nogil = True" ve TensorFlow / PyTorch JIT yayınlar.

Çoklu işlem (çoklu işlem) ve çok iş parçacıklı (çok iş parçacıklı)

Örnek olay incelemesine girmeden önce, birkaç ilgili kavramı tanıtmama izin verin.

Önce paralel ve eşzamanlılık arasındaki farkı tanıtın:

  • Eşzamanlılık: Örtüşen zaman dilimlerinde gerçekleştirilebilen birden fazla işlemi ifade eder.Örneğin, ilk zaman diliminde, A iş parçacığı çalıştırır ve B iş parçacığı blokları; ikinci zaman diliminde, B iş parçacığı G / Ç için bekler, Ve A evresi yürütülür; üçüncü zaman diliminde, iş parçacığı B halen G / Ç beklerken A evresi yürütülür.

  • Paralel (paralellik): Aynı anda birden çok işlemi ifade eder. Hangi zaman diliminde olursa olsun, iki iş parçacığı aynı anda belirli bir durumda olabilir. Örneğin, ilk zaman diliminde, A iş parçacığı çalıştırılır ve B iş parçacığı çalıştırılır; ikinci zaman diliminde, iş parçacığı G / Ç'yi bekler ve iş parçacığı da G / Ç'yi bekler; üçüncü zaman diliminde, iş parçacığı A çalışır , Ve B iş parçacığı da çalışır.

Çoklu iş parçacığı, eşzamanlılık iş parçacığı modelini kullandığımız anlamına gelirken, çoklu işlem paralelliğin iş parçacığı modelini kullanıyor. Her birinin avantajları ve dezavantajları vardır:

  • Çok iş parçacıklı eşzamanlılığın avantajı şudur: bellek alanı veri alışverişini kolaylaştırmak için paylaşılabilir; dezavantajı, belleğe aynı anda yazacak ve bu da verilerin zarar görmesine neden olacaktır.

  • Çok süreçli paralelizmin avantajları şunlardır: bellek alanı bağımsızlığı (dezavantajlarından); dezavantajları: süreçler arası etkileşim serileştirme-iletişim-seriyi kaldırma gerektirir.

Ardından, Python eşzamanlılığına birkaç farklı çözüm denemek için bir durum kullanacağız:

(Python eşzamanlılığını denemek için birkaç farklı çözümün durum açıklamaları için lütfen 00:19:05 videoya tekrar bakın, = aitechtalkyinlibo )

Bu, çoklu işlem kavramından bahseder. Uygulanabilir senaryoları şunları içerir:

  • Yüksek CPU kullanımı

  • Alt süreçler arasında basit iletişim

  • İlgili değişkenler ve işlevler serileştirilebilir, ancak daha az bellek kullanır

Daha fazlasını öğrenmek istiyorsanız, belgeye bakabilirsiniz:

https://docs.python.org/3/library/multiprocessing.html

https://docs.python.org/3/library/concurrent.futures.html

Ardından, çok işlemli çözümün vaka açıklamasını girin:

(Çok işlemli çözümün vaka açıklaması için lütfen 00:23:25 adresindeki videoyu inceleyin, = aitechtalkyinlibo )

Daha sonra multithreading hakkında konuşacağız.Multithreading'in kullanım senaryoları şunları içerir:

  • Düşük CPU kullanımı

  • Yüksek G / Ç yükü

  • Alt görevlerin paylaşılan belleğe ihtiyacı var

Daha fazla bilgi edinmek için belgeye bakabilirsiniz:

https://docs.python.org/3/library/threading.html

https://docs.python.org/3/library/queue.html

(Çok iş parçacıklı çözümün durum açıklaması için lütfen 00:33:25 adresindeki videoya tekrar bakın, = aitechtalkyinlibo )

Python çok iş parçacıklı programlamanın zorluklarına bir göz atalım.Aşağıdaki zorluklardan bazıları Python'a özgüdür ve bazıları tüm çoklu kullanım için ortak problemlerdir:

İlk olarak, CPython'un iş parçacığı anahtarlaması rastgele bayt kodlar arasında gerçekleşebilir ve Python talimatları atomik değildir.

İkincisi, kısıtlı kaynaklara her eriştiğinizde bir kilit almanız gerekir

Üçüncüsü, kilit zorunlu değildir, kilidi almayı unutsanız bile kod çalışabilir

Dördüncüsü, rekabet durumunun kopyalanması zordur

İlgili çok iş parçacıklı bir sayaca bakalım:

(Çok iş parçacıklı sayaçla ilgili durum açıklaması için lütfen 00:37:00 videoya tekrar bakın, = aitechtalkyinlibo )

Eşzamansız (eşzamansız)

Ardından eşzamansız (eşzamansız) hakkında konuşun. Python'da eşzamansızlık, engellemeyen görevleri iş parçacıklarından daha verimli bir şekilde organize etmek için tek bir iş parçacığındaki üreteçleri kullanan bir yordamdır. Koroutinin anahtarı Python yorumlayıcısında yapılır. Elbette, Go'nun gorutini gibi diğer diller de eşzamansız programlamaya sahiptir ve Nginx, eşzamansız programlamayı uygulamak için C'yi kullanır.

Daha fazla eşzamansız programlama içeriği için belgeye bakabilirsiniz:

https://docs.python.org/3/library/asyncio-task.html

Vakaya bakmadan önce, asenkron ve ileti dizisini karşılaştıralım. İş parçacıkları ile karşılaştırıldığında, asenkron özelliğin avantajları ve dezavantajları şunlardır:

Avantaj:

  • Basit çoklu görev modeli

  • Coroutine anahtarlama noktasını temizle

  • Sistem ek yükü, işletim sistemi yerel iş parçacıklarından çok daha küçüktür

Dezavantajları:

  • Nispeten bağımsız bir ekosisteme sahip olun

  • Diğer eşzamanlılık modelleriyle karıştırmak zor

  • API hala kararlı değil

Eşzamansız duruma bakalım:

(Eşzamansız durum açıklaması için lütfen 00:46:05 adresindeki videoya tekrar bakın, = aitechtalkyinlibo )

Dağıtılmış bilgi işlem (örnek olarak Dask'ı alın)

Son olarak, dağıtılmış hesaplamadan bahsedeceğim Bu sınıftaki dağıtılmış bilgi işlem, örnek olarak Dask'ı alacaktır.

Dask, NumPy ve Pandas'ı genişletmek için kullanılabilen aritmetik grafiklere dayalı dinamik bir görev zamanlayıcıdır. Soldaki şekil Dask'ın çalışma grafiğidir.

(Dask aritmetik diyagramının açıklaması için lütfen 00:55:45, adresindeki videoya tekrar bakın)

Başka bir dağıtılmış bilgi işlem yöntemi olan Spark ile karşılaştırıldığında, Dask çok ayırt edici özelliklere sahiptir:

  • Saf bir Python uygulamasıdır

  • Harita azaltma paradigmasını takip etmeye gerek yok

  • İnce taneli zamanlama daha düşük gecikme sağlar

Dask'ta, Distributed konusunda daha çok endişeliyiz. Dask'ın heterojen kümeler üzerindeki bir uzantısıdır. Ağ yapısı, istemci-planlayıcı-çalışan düğümü biçimini takip eder, bu nedenle tüm düğümlerin aynı Python işletim ortamına sahip olması gerekir.

Şimdi basit bir duruma bakacağız:

(Vakanın açıklaması için lütfen 00:59:45 adresindeki videoya tekrar bakın, = aitechtalkyinlibo )

Son olarak, temelde youtube'da izlenebilen bugünün dersiyle ilgili konuşmaları koydum.

Dave Beazley: Python GIL'i Anlamak, PyCon 2010

https://www.youtube.com/watch?v=Obt-vMVdM8s

https://www.dabeaz.com/python/UnderstandingGIL.pdf

Dave Beazley: Global Tercüman Kilidini (GIL) Kucaklamak, PyCodeConf 2011

https://www.youtube.com/watch?v=fwzPF2JLoeU

Larry Hastings: Python'un Ünlü GIL, PyCon 2015

https://www.youtube.com/watch?v=KVKufdTphKs

Larry Hastings: Python'un GIL'ini Çıkarma: Gilektomi, PyCon 2016

https://www.youtube.com/watch?v=P3AyI_u66Bw

Bir Jesse Jiryu Davis: GIL'i Grekleyin Hızlı ve İş Parçacığı Güvenli Python, PyCon 2017

https://www.youtube.com/watch?v=7SSYhuk5hmc

Raymond Hettinger: Eş Zamanlılık Üzerine Keynote, PyBay 2017

https://www.youtube.com/watch?v=9zinZmE3Ogk

https://pybay.com/site_media/slides/raymond2017-keynote/index.html

Dave Beazley: Async'de Korku ve Beklenti: Coroutine Rüyasının Kalbine Vahşi Bir Yolculuk

https://www.youtube.com/watch?v=E-1Y4kSsAFc

Robert Smallshire: Asyncio ile Python 3'te Coroutine Eşzamanlılığı

https://www.youtube.com/watch?v=c5wodlqGK-M Matthew Rocklin: Geçici dağıtılmış bilgi işlem için Dask

https://www.youtube.com/watch?v=EEfI-11itn0

Matthew Rocklin: Dask: A Pythonic Dağıtılmış Veri Bilimi Çerçevesi, PyCon 2017

https://www.youtube.com/watch?v=RA_2qdipVng

Yukarıdakiler, bu sayıda davetliler tarafından paylaşılan tüm içeriklerdir. Daha fazla genel sınıf videosu için lütfen izlemek için Leifeng.com AI Araştırma Topluluğu'nu ( ziyaret edin. WeChat genel hesabını takip edin: AI Araştırma Enstitüsü (okweiwu), en son genel sınıf canlı yayın süresi önizlemesini edinebilirsiniz.

En havalı görünüm, vivo X21 FIFA Dünya Kupası olağanüstü harita ödülü
önceki
Riot en son kahraman değişim planını resmen yayınladı ve Kılıç Kız tekrar saldırıya uğramanın hedefi oldu
Sonraki
Umrumda değil, sadece güzel görünümlü kırtasiye malzemeleri alarak iyi çalışabilirsin!
"Thunder Shazan! Yarın şok edici bir şekilde yayınlanacak, Çin'in nihai fragmanı altı olağanüstü önemli anı ortaya çıkarıyor
Daha rahat oturmak istiyorsanız, bağımsız süspansiyonlu bu ortak girişim SUV'ları seçin.
Olağanüstü güç, üstün bir deneyim haline gelir, bin yuan Liu Haiping cep telefonu tavsiyesi
Yanlışlıkla güzelliğini kapattı ve sayısız hayranını kaybetti, ancak güzelliğinden sorumlu olduğu söylendi
Bu küçük makyajdan sonra, BMW 1 Serisi artık arkadan çekişe sahip değil!
Tanrı düzeyinde IP coşkusunun geri dönüşü, "ajan ölüm tanrısı" uygulaması başlıyor
iPhone 8C konsept tasarımı yayınlandı, kavisli gövde Huawei Mate X'e meydan okuyor mu?
Yüzün tepesi! Kişiliğinizi göstermek için en iyi seçim: Onur 10 Önerisi
Seçici olma korkusunu hissetmek ister misiniz? ! Visvim 2018SS'nin tüm öğeleri şimdi yayınlandı!
LOL Europe Service Information, Wannian'ın soğuk sıra orta şerit kahramanının gerçekten havalandığını kimse hayal edemezdi
Maliyet etkinliği anahtar kelimedir, Outlander 2.0L Honor Edition test sürüşü
To Top