Tek bir Flask işlemi aynı anda kaç istek alır?


139

Flask ile bir uygulama geliştiriyorum, ancak WSGI hakkında fazla bir bilgim yok ve bunun HTTP tabanı, Werkzeug. Bir Flask uygulamasını silahlı mısır ve 4 işçi işlemiyle sunmaya başladığımda, bu aynı anda 4 isteği işleyebileceğim anlamına mı geliyor?

Eşzamanlı istekleri kastediyorum, saniye başına istek veya başka bir şey değil.

Yanıtlar:


184

Geliştirme sunucusunu çalıştırırken - ki bu çalıştırarak elde edeceğiniz şey app.run(), tek bir eşzamanlı süreç elde edersiniz, yani bir seferde en fazla 1 istek işleniyor demektir.

Gunicorn'u varsayılan yapılandırmasında önüne yapıştırarak ve basitçe sayısını artırarak, --workerselde ettiğiniz şey aslında her biri app.run()geliştirme sunucusu gibi davranan bir dizi işlemdir (Gunicorn tarafından yönetilen) . 4 işçi == 4 eşzamanlı istek. Bunun nedeni, Gunicorn'un içerdiği syncişçi türünü varsayılan olarak kullanmasıdır.

Gunicorn'un asenkron işçileri de içerdiğine dikkat etmek önemlidir, yani eventletve gevent(ve aynı zamanda tornado, en iyi Tornado çerçevesi ile kullanılır, öyle görünüyor). Bu eşzamansız çalışanlardan birini --worker-classbayrakla belirterek , Gunicorn'un her biri kendi eşzamanlılığını yöneten bir dizi eşzamansız süreci yönetmesidir. Bu işlemler evreleri değil, eşgüdümleri kullanır. Temel olarak, her süreç içinde bir seferde yalnızca 1 şey olabilir (1 iş parçacığı), ancak nesneler harici işlemlerin bitmesini beklerken (veritabanı sorgularını veya ağ G / Ç'sini beklerken) 'duraklatılabilir'.

Bu, Gunicorn'un eşzamansız çalışanlarından birini kullanıyorsanız, her çalışanın bir seferde tek bir talepten çok daha fazlasını karşılayabileceği anlamına gelir. Kaç çalışanın en iyi olduğu, uygulamanızın doğasına, çevresine, üzerinde çalıştığı donanıma, vb. Bağlıdır . Daha fazla ayrıntı Gunicorn'un tasarım sayfasında bulunabilir ve gevent'in giriş sayfasında nasıl çalıştığına dair notlar bulunabilir .


4
Gunicorn artık 19 sürümünden beri "gerçek" konuları destekliyor . Bunu ve buna bakın .
Filipe Correia

2
Hangi kaynakların (ve nasıl) paylaşıldığı ve hangilerinin iş parçacıkları / süreçler arasında tamamen ayrı olduğu nasıl takip edilir? Örneğin, Gunicorn tarafından yönetilen ve Flask işleyicilerinde kullanılan çeşitli işlemler arasında büyük bir veri yapısını paylaşmak istediğim bir durumu nasıl idare edebilirim?
Johann Petrak

@Johsm'den sorduğunuz şey, işletim sistemindeki farklı işlemler arasında verilerin nasıl paylaşılacağını sormak gibidir. Bunun cevabı sorunuza cevap verebilir, işlemler hafızasını diğer işlemlerle paylaşmadığı için harici depolama kullanmak zorundasınız. Gunicorn, yalnızca çok işlemcili CPU mimarilerini kullanmak için burada, ancak bu sorunları ele almıyor.
adkl

Eve ne olacak? Bu Havva için de geçerli mi?
Eswar

2
flask geliştirme sunucusu v1.0'dan beri varsayılan olarak iş parçacıkları kullanıyor ( github.com/pallets/flask/pull/2529 )
hychou

40

Şu anda, halihazırda sunulanlardan çok daha basit bir çözüm var. Uygulamanızı çalıştırırken sadece threaded=Trueparametreyi app.run()çağrıya iletmeniz gerekir, örneğin:

app.run(host="your.host", port=4321, threaded=True)

Werkzeug belgelerinde görebildiğimiz gibi başka bir seçenek de, işlenecekprocesses maksimum eşzamanlı işlem sayısını gösteren bir sayı> 1 alan parametreyi kullanmaktır :

  • iş parçacıklı - süreç her isteği ayrı bir iş parçacığında ele almalı mı?
  • süreçler - 1'den büyükse, bu maksimum eşzamanlı işlem sayısına kadar her bir talebi yeni bir süreçte işleyin.

Gibi bir şey:

app.run(host="your.host", port=4321, processes=3) #up to 3 processes

Buradarun() yöntem hakkında daha fazla bilgi ve beni çözümü ve api referanslarını bulmaya yönlendiren blog yazısı .


Not:run() Yöntemlerle ilgili Flask belgelerinde, bunun bir Üretim Ortamında kullanılmasının önerilmediği belirtilmiştir çünkü ( alıntı ): "Hafif ve kullanımı kolay olmasına rağmen, Flask'ın yerleşik sunucusu, iyi ölçeklenmediği için üretim için uygun değildir ."

Ancak, üretime giderken bunu yapmanın önerilen yolları için Dağıtım Seçenekleri sayfasına işaret ederler .


5
Bilgi için teşekkürler. Çalıştırma belgesinin, güvenlik veya performans gereksinimlerini karşılamadığını belirten bir üretim ortamında kullanılmaması gerektiğini belirttiğine dikkat etmek önemlidir.
Coffee_fan

1
@Coffee_fan haklısın. En son 1.1.x sürümlerinde bile bunu önermiyorlar ve bunun yerine üretime geçerken Dağıtım Seçenekleri sayfalarını kontrol etmeyi öneriyorlar .
Cevaba

33

Flask aynı anda iş parçacığı başına bir istek işleyecektir. Her biri 4 iş parçacığı içeren 2 işleminiz varsa, bu 8 eşzamanlı istektir.

Flask, iş parçacığı veya süreçleri ortaya çıkarmaz veya yönetmez. WSGI ağ geçidinin sorumluluğu budur (örn. Gunicorn).


9

Hayır, bundan daha fazlasını kesinlikle halledebilirsiniz.

Derinlemesine, tek çekirdekli bir makine çalıştırdığınızı varsayarsak, CPU'nun her seferinde yalnızca bir talimatı * çalıştırdığını hatırlamak önemlidir.

Yani, CPU yalnızca çok sınırlı bir komut dizisini yürütebilir ve saat tıklaması başına birden fazla komut yürütemez (birçok komut 1'den fazla tıklama alır).

Bu nedenle, bilgisayar bilimlerinde bahsettiğimiz çoğu eşzamanlılık, yazılım eşzamanlılığıdır. Başka bir deyişle, alt seviye CPU'yu bizden soyutlayan ve aynı anda kod çalıştırdığımızı düşünmemizi sağlayan yazılım uygulama katmanları vardır.

Bu "şeyler", her bir sürecin kendi dünyasında kendi paylaşılmayan hafızasıyla çalıştığını düşünmesi anlamında eşzamanlı olarak çalıştırılan kod birimleri olan süreçler olabilir.

Diğer bir örnek, eşzamanlılığa da izin veren süreçler içindeki kod birimleri olan iş parçacıklarıdır.

4 çalışan işleminizin 4'ten fazla isteği işleyebilmesinin nedeni, giderek daha fazla isteği işlemek için iş parçacıkları açacak olmalarıdır.

Gerçek istek sınırı, seçilen HTTP sunucusuna, G / Ç, İşletim Sistemi, donanım, ağ bağlantısı vb.

İyi şanslar!

* talimatlar CPU'nun çalıştırabileceği en temel komutlardır. örnekler - iki sayı ekleyin, bir talimattan diğerine atlayın


1
İpleri mi yoksa Flask'ı mı yumurtluyor? Her iki olasılığı da destekleyen hiçbir kanıt bulamadım.
jd.

1
Elbette, süreçler hakkında bunu anlıyorum, ancak cevap, gerektiğinde daha fazla iş parçacığı ortaya çıktığını söylüyor. Doğrulamak istediğim şey bu.
jd.

4
"Derinlemesine, tek çekirdekli bir makine çalıştırdığınızı varsayarsak, CPU gerçekten her seferinde yalnızca bir komut * çalıştırır" Bu modern makinelerde doğru değildir. Çoğu modern CPU, ardışık düzende ve üst skaladır , burada tek bir çekirdek bile birden fazla yürütme birimine ve yazılım tarafından görülen "makine kodunu" tek tek yürütme birimlerine gönderilen gerçek donanım mikro işlemlerine dönüştüren bir talimat kod çözücüye sahiptir.
Michael Geary

1
Açıklığa kavuşturmak için, gün içinde, CPU'lar aslında doğrudan bir yürütülebilir dosyadaki sayısal talimatları - makine kodunu yürüttüler. Her CPU referansının, herhangi bir bellek referansı dahil olmak üzere her talimatın kaç saat döngüsü aldığını gösteren bir talimat zamanlama çizelgesi vardı. Böylece herhangi bir kod parçasının ne kadar süreceğini bilmek için zamanlamaları toplayabilirsiniz. Modern CPU'lar hiç de öyle değil. İlginç bir istisna, modern bir süper skalar ARM işlemciye ve sabit talimat zamanlamalı iki eski moda "PRU" işlemciye sahip BeagleBone'dur .
Michael Geary

1
Ve bunu açıklığa kavuşturmak için , "modern" dediğimde, bunu ARM / Intel / AMD yongaları gibi işlemciler için gevşek bir kısaltma olarak kullanıyordum - boru hatlı, süper skalar vb. Elbette, sabit zamanlamayla eski yöntemle çalışan modern işlemciler de var. Bahsettiğim BeagleBone PRU'lar ve çeşitli yeni mikro denetleyiciler gibi talimat başına. (Ve şimdi Gunicorn'a geri dönelim!)
Michael Geary
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.