Yalnızca Flask app.run () öğesini bağımsız olarak kullanarak birden fazla istemciye hizmet verebilir miyim?


204

Flask'ı Apache veya diğer web sunucularına bağlayabileceğimi biliyorum. Ancak, Flask'ı aynı anda birden fazla istemciye hizmet veren bağımsız bir sunucu olarak çalıştırmayı düşünüyordum.

Mümkün mü? Birden fazla iş parçacığının yumurtlanması ve yönetilmesi gerekir mi?

Yanıtlar:


297

flask.Flask.run**optionsileriye dönük ek anahtar kelime argümanlarını ( ) kabul eder werkzeug.serving.run_simple- bu argümanlardan ikisi threaded(boolean) ve processes(werkzeug'un istekleri işlemek için birden fazla işlem üretmesi için birden fazla sayıya ayarlayabilirsiniz).

threadedTrueFlask 1.0'dan itibaren varsayılan olarak kullanılır, bu nedenle Flask'ın en son sürümleri için, varsayılan geliştirme sunucusu varsayılan olarak aynı anda birden fazla istemciye hizmet verebilir. Flask'ın daha eski sürümlerinde, threaded=Truebu davranışı etkinleştirmek için açıkça geçebilirsiniz .

Örneğin,

if __name__ == '__main__':
    app.run(threaded=True)

eski Flask sürümleriyle uyumlu bir şekilde iş parçacıklarını kullanarak birden çok istemciyi ele almak veya

if __name__ == '__main__':
    app.run(threaded=False, processes=3)

Werkzeug'a gelen talepleri karşılamak için üç süreç ortaya koymasını söyleyin, ya da sadece

if __name__ == '__main__':
    app.run()

Flask 1.0 veya üstünü kullanacağınızı biliyorsanız, birden çok istemciyi iş parçacıkları kullanarak işleme.

Bununla birlikte, Werkzeug'un serving.run_simplestandart kütüphanenin wsgirefpaketini tamamladığını ve bu paketin üretime hazır bir web sunucusu değil, WSGI'nin referans uygulamasını içerdiğini söyledi. Flask'ı üretimde kullanacaksanız ("üretim" in en fazla 10 eşzamanlı kullanıcısı olmayan düşük trafikli bir dahili uygulama olmadığı varsayılarak) gerçek bir web sunucusunun arkasında durduğunuzdan emin olun (Flask dokümanlarının başlıklı bölümüne bakın) Önerilen bazı yöntemler için Dağıtım Seçenekleri ).


2
En fazla 100 kullanıcıya bakıyorsam ne olur? Sadece atayabilir processes=100ve ondan mutlu olabilir miyim ? Benim durumumda, sadece statik dosyalara ihtiyacım var, HTTP Post yöntemlerine gerek yok. Benim gereksinimim, tüm Flask iş parçacıklarını ana uygulamamın bir parçası olarak çalıştırmak istiyorum, böylece hepsi değişkenleri paylaşabilir.
ATOzTOA

4
Chuckles - @ATOzTOA - hayır, bu muhtemelen oldukça üretken olacaktır (İşlemler nispeten pahalıdır ve her talepte çok fazla iş yapmazsanız, 4 veya 8 işlemin yeterli olmamasının bir nedeni yoktur). Bununla birlikte, yalnızca statik içerik görüntülüyorsanız, bunu yapmak için optimize edilmiş bir sunucu (Apache, ngnix, IIS) ile daha iyi durumda olursunuz.
Sean Vieira

2
Ayrıca, değişkenleri istekler arasında paylaşmanız gerekmez; bunu yaparsanız, kendinizi bir işlemle sınırlamanız veya bant dışı iletişim (Redis, veritabanı, dosya sistemi vb.) Kullanmanız gerekir. süreçlerinizin her biri senkronize kalır.
Sean Vieira

3
@ATOzTOA - Eğer daha iyi bir sunucu döndüremezseniz, o zaman sadece bir koşuşturma vermek ve ne olduğunu görmek istiyorum. Yük altında iyi performans göstermezse, farklı bir web sunucusunun arkasına dağıtabilirsiniz.
Sean Vieira

2
@ATOzTOA, neden aynı anda 'iş parçacığı' ve 'süreçleri' belirleyemediğiniz hakkındaki sorunuzla ilgili kodu şurada inceleyin: werkzeug.readthedocs.org/en/latest/_modules/werkzeug/serving
pyrho

63

app.run()Flask içinden simple öğesini kullanmak, tek seferde yalnızca bir istemciye hizmet verebilen tek bir iş parçacığında tek bir eşzamanlı sunucu oluşturur. Tam da bu nedenle düşük talepli (yani geliştirme, hata ayıklama) kontrollü ortamlarda kullanılmak üzere tasarlanmıştır.

Konuları yumurtlamak ve kendiniz yönetmek, muhtemelen Python GIL nedeniyle sizi çok ileriye götürmeyecektir .

Bununla birlikte, hala iyi seçenekleriniz var. Gunicorn , birden fazla çalışanı (ayrı süreçler, bu yüzden GIL endişesi yok) oluşturmanıza ve hatta uygulamanızı hızlandıracak (ve daha güvenli hale getirecek) asenkron çalışanlarla birlikte gelen sağlam, kullanımı kolay bir WSGI sunucusudur. (özellikle Flask ile) sizin işinizde.

Yine de, Gunicorn bile muhtemelen doğrudan halka açık olmamalıdır. Üretimde, daha sağlam bir HTTP sunucusunun arkasında kullanılmalıdır; nginx , Gunicorn ve Flask ile iyi gitme eğilimindedir.


17
tam olarak değil. Gunicorn python, nginx değil. Yine de onları böyle kullanmazsınız. Gunicorn, uygulamanızı gunicorn app:app 127.0.0.1:8080yerine çalıştırmanıza izin verir python app.py. Nginx özel Gunicorn işletilen uygulamasını ortaya kamu hizmeti olarak hareket edecek (Bir ters proxy) belki vs. doğrudan statik sunum dosyalarını, alt düzey HTTP uygulama ayrıntıları her türlü gizleme,
Ryan Artecona

App.run ile Flask (threaded = True) mod_wsgi kullanarak Apache2'de
MortenB
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.