[ad_1]
Python web uygulamaları uzun süredir Web Sunucusu Ağ Geçidi Arayüzü (WSGI) standart, web sunucularıyla nasıl konuştuklarını açıklar. İlk olarak 2003’te tanıtılan ve 2010’da güncellenen WSGI, yalnızca Python’da 2.2 sürümünden itibaren yerel olarak bulunan ve uygulanması kolay özelliklere dayanır. Sonuç olarak, WSGI tüm büyük Python web çerçeveleriyle hızlı bir şekilde ilgilendi ve Python’da web geliştirmenin temel taşı haline geldi.
2022’ye hızlı ileri. Python 2 artık eskidi (en sonunda) ve Python artık ağ çağrıları gibi eşzamansız işlemleri işlemek için yerel sözdizimine sahip. WSGI ve varsayılan olarak eşzamanlı davranışları varsayan diğer standartlar, zaman uyumsuzluğunun performans ve verimlilik kazanımlarından yararlanamaz. Bu da WSGI’nin WebSocket gibi gelişmiş protokolleri etkin bir şekilde işleyemeyeceği anlamına gelir.
ASGI’yi girin, Asenkron Sunucu Ağ Geçidi Arayüzü. WSGI gibi ASGI, bir Python web uygulaması ile web sunucusu arasında ortak bir arabirim tanımlar. WSGI’den farklı olarak ASGI, uygulama başına birden çok eşzamansız olaya izin verir. Ayrıca ASGI, hem senkronizasyon hem de zaman uyumsuz uygulamaları destekler. Eski, eşzamanlı WSGI web uygulamalarınızı ASGI’ye geçirebilir ve yeni, eşzamansız web uygulamaları oluşturmak için ASGI’yi kullanabilirsiniz.
WSGI nasıl çalışır?
WSGI, tipik olarak adlandırılmış bir Python işlevini açığa çıkararak çalışır. application
veya app
, web sunucusuna. Bu fonksiyon iki parametre alır:
environ
: Mevcut istek hakkında bilgi içeren bir sözlük ve Ortam Değişkenleri web sunucusu tarafından sağlanır.start_response
: İstemciye bir HTTP yanıtı göndermeyi başlatmak için kullanılacak bir işlev.
İşlev tarafından döndürülen veriler yanıt gövdesini oluşturur.
Basit application
işlev şöyle görünebilir:
def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) return [b'Greetings universe']
Flask gibi WSGI uyumlu bir web çerçevesi kullanıyorsanız, çerçevenin kendisi bir application
tüm bileşenleri otomatik olarak bağlanmış şekilde çalışır.
WSGI’nin dezavantajları iki yönlüdür. İlk olarak, WSGI, yanıtın hemen döndürüleceği varsayımıyla, bir seferde yalnızca tek bir istek ve yanıtı işler. WebSocket veya uzun yoklamalı HTTP bağlantısı gibi uzun süreli bağlantılarla başa çıkmanın bir yolu yoktur.
İkincisi, WSGI yalnızca eşzamanlıdır. Çok iş parçacıklı bir bağlantı havuzu kullansanız bile, her bağlantı bir yanıt döndürene kadar engellenir. Birçok WSGI kurulumu, iş parçacığı ve işlem havuzlarını işleme yeteneğine sahiptir, ancak bunlar WSGI arabirimi tarafından sınırlandırılmıştır. kendisi senkron olmak.
ASGI nasıl çalışır?
ASGI, dışa doğru WSGI’ye benzer. WSGI’da olduğu gibi, bir application
işlev nesnesi, bunun dışında bir async
iki yerine üç parametre ile işlev:
scope
: Mevcut istek hakkında bilgi içeren bir sözlük, şuna benzer:environ
WSGI’da, ancak ayrıntılar için biraz farklı bir adlandırma kuralıyla.send
: Birasync
Uygulamanın istemciye mesaj göndermesini sağlayan çağrılabilir (işlev).receive
: Birasync
Uygulamanın istemciden mesaj almasını sağlayan çağrılabilir.
Basit bir ASGI application
işlev şöyle görünebilir:
async def application(scope, receive, send): await send({ 'type': 'http.response.start', 'status': 200, 'headers': [ [b'content-type', b'text/plain'], ], }) await send({ 'type': 'http.response.body', 'body': b'Hello, world!', })
Bir WSGI web çerçevesi gibi, bir ASGI web çerçevesi de kendi application()
işlevini yerine getirin ve gerektiği gibi bağlayın.
ASGI ile en belirgin fark, işlev boyunca zaman uyumsuz metaforlar kullanmamızdır. Fonksiyonun kendisi async
ve HTTP başlıklarını ve yanıt gövdesini iki ayrı yolla göndeririz. await send()
komutlar. Böylece fonksiyonun kendisi ve send
komutlar, hiçbir şeyi engelleme; çağrılarıyla karıştırılabilirler. application
ve send
aynı anda diğer birçok bağlantıdan.
kullanmıyoruz receive
bu örnekte, ama o da bir async
işlev. Diğer işlemleri engellemeden istek gövdesini almamızı sağlar. İstekler ve yanıtlar, sunucuya veya sunucudan bu şekilde aşamalı olarak aktarılabilir; bu, WSGI kullanarak zarif bir şekilde veya belki de hiç yapamadığımız bir şeydir.
ASGI ile senkronizasyon ve zaman uyumsuz işlevlerini kullanma
ASGI kullanırken, kullanmak isteyeceksiniz async
işlevler ve zaman uyumsuz kitaplıklar, mümkün olduğunca. Kullanma alışkanlığı kazanmak için öder async
, çünkü yalnızca eşitleme kodunu kullanmayla ilgili sorunlar önemli olabilir. Yalnızca eşitleme işlevine yapılan uzun süreli herhangi bir çağrı, çağrı zincirinin tamamını engelleyerek, zaman uyumsuz kullanmanın yararlarını ortadan kaldırır, ancak buharlaşır.
Bir şey için uzun süredir devam eden eşzamanlı bir çağrıyı kullanmakta zorlanıyorsanız, asyncio.run_in_executor
çağrıyı bir iş parçacığına veya işlem havuzuna toplamak için. Harici bir olayı veya CPU yoğun olmayan bir görevi beklerken bir iş parçacığı havuzu kullanılmalıdır. CPU yoğun yerel görevler için bir işlem havuzu kullanılmalıdır.
Örneğin, web uygulamanızda uzak bir web sitesine çağrı yapan bir rotanız varsa, bir iş parçacığı kullanmalısınız veya daha iyisi, aiohttp
zaman uyumsuz HTTP istekleri yapan kitaplık. Bir görüntüyü yeniden boyutlandırmak için Yastık görüntü kitaplığını çağırmak istiyorsanız, muhtemelen kullanmalısınız. run_in_executor
bir süreç havuzu ile. Verileri işlemler arasında ileri geri taşımak için biraz ek yük olsa da, run_in_executor
diğer etkinlikleri engellemez.
ASGI’ye hazır web çerçeveleri
ASGI web uygulamalarını “elle” yazmak mümkündür. application()
nesne. Ancak çoğu zaman eşzamansız yerel, ASGI merkezli bir Python web çerçevesi kullanmak daha basit (ve daha az baş ağrısına neden olan) olacaktır. ASGI ile iyi çalışan bazı yaygın web çerçevesi seçenekleri şunlardır:
- Starlette ve FastAPI: Bu gelecek vaat eden çerçeveler (FastAPI üstüne inşa edilmiştir yıldız) her ikisi de zaman uyumsuzdur, bu nedenle ikisinin de ASGI’yi desteklemesi şaşırtıcı değildir. Boş bir sayfadan bir web uygulaması başlatıyorsanız, bunlar Python için en modern ve son teknoloji web çerçeveleridir.
- çeyrek: Temel Python web çerçevesi Flask, ASGI’yi desteklerken, Flask, zaman uyumsuz metaforlardan yararlanmak için içten dışa tasarlanmamıştır. çeyrekGitLab’dan, Flask’ın sözdizimini ve metaforlarını kullanır, ancak zaman uyumsuz rota işleyicilerine izin verir.
- Django 3.0 ve üstü: Django 3.0’dan itibaren, saygıdeğer Django web çerçevesi ASGI’yi destekler. Django 3.1’de Django’yu bir ASGI işleyicisine monte edebilmek yerine, bir Django uygulamasında zaman uyumsuz kod desteği eklendi. Yürütme hızıyla bilinmeyen bir çerçeve için, yalnızca async varlığı, onu kullanmayı seçenler için daha yüksek performansın kilidini açar.
Telif Hakkı © 2022 IDG Communications, Inc.
[ad_2]
Kaynak : https://www.infoworld.com/article/3658336/asgi-explained-the-future-of-python-web-development.html#tk.rss_all