ฉันสามารถให้บริการลูกค้าหลายรายโดยใช้เพียงแอพ Flask เป็นแบบสแตนด์อโลนได้หรือไม่


204

ฉันรู้ว่าฉันสามารถเชื่อมโยง Flask กับ Apache หรือเว็บเซิร์ฟเวอร์อื่น ๆ ได้ แต่ฉันคิดว่าการใช้ Flask เป็นเซิร์ฟเวอร์แบบสแตนด์อโลนที่ให้บริการลูกค้าหลายรายพร้อมกัน

เป็นไปได้ไหม ฉันต้องจัดการกับการวางไข่หลายเธรดและจัดการได้อย่างไร

คำตอบ:


297

flask.Flask.runยอมรับอาร์กิวเมนต์คำหลักเพิ่มเติม ( **options) ที่ส่งต่อไปที่werkzeug.serving.run_simple- อาร์กิวเมนต์สองตัวคือthreaded(บูลีน) และprocesses (ซึ่งคุณสามารถตั้งค่าเป็นตัวเลขที่มากกว่าหนึ่งเพื่อให้มี werkzeug วางไข่ได้มากกว่าหนึ่งกระบวนการเพื่อจัดการคำขอ)

threadedค่าเริ่มต้นTrueเป็นของ Flask 1.0 ดังนั้นสำหรับ Flask เวอร์ชันล่าสุดเซิร์ฟเวอร์การพัฒนาเริ่มต้นจะสามารถให้บริการไคลเอนต์หลาย ๆ ตัวพร้อมกันโดยค่าเริ่มต้น สำหรับ Flask รุ่นเก่ากว่าคุณสามารถผ่านได้อย่างชัดเจนthreaded=Trueเพื่อเปิดใช้งานลักษณะการทำงานนี้ได้

ตัวอย่างเช่นคุณสามารถทำได้

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

เพื่อจัดการไคลเอ็นต์หลายรายการโดยใช้เธรดด้วยวิธีที่เข้ากันได้กับ Flask เวอร์ชันเก่าหรือ

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

เพื่อบอกให้ Werkzeug วางไข่สามกระบวนการเพื่อจัดการกับคำร้องขอที่เข้ามาหรือเพียงแค่

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

เพื่อจัดการไคลเอ็นต์หลายรายการโดยใช้เธรดถ้าคุณรู้ว่าคุณจะใช้ Flask 1.0 หรือใหม่กว่า

ที่ถูกกล่าวว่า Werkzeug ของserving.run_simpleห่อwsgirefแพคเกจของห้องสมุดมาตรฐาน- และแพคเกจที่มีการดำเนินการอ้างอิงของ WSGI ไม่ใช่เว็บเซิร์ฟเวอร์พร้อมผลิต หากคุณกำลังจะใช้ Flask ในการผลิต (สมมติว่า "การผลิต" ไม่ใช่แอปพลิเคชันภายในที่มีปริมาณการใช้งานต่ำและมีผู้ใช้ไม่เกิน 10 คนพร้อมกัน) ตรวจสอบให้แน่ใจว่าได้ยืนอยู่ด้านหลังเว็บเซิร์ฟเวอร์จริงตัวเลือกการปรับใช้สำหรับวิธีการที่แนะนำ)


2
จะทำอย่างไรถ้าฉันดูผู้ใช้ไม่เกิน 100 คน ฉันสามารถมอบหมายprocesses=100และมีความสุขกับมันได้หรือไม่ ในกรณีของฉันฉันต้องการไฟล์คงที่ไม่มีวิธีการโพสต์ HTTP ความต้องการของฉันคือฉันต้องการเรียกใช้ Flask เธรดทั้งหมดซึ่งเป็นส่วนหนึ่งของแอพแม่ของฉันเพื่อให้พวกเขาทั้งหมดสามารถแชร์ตัวแปรได้
ATOzTOA

4
หัวเราะเบา ๆ - @ATOzTOA - ไม่ว่าจะอาจจะค่อนข้างเคาน์เตอร์มีประสิทธิผล (กระบวนการที่ค่อนข้างมีราคาแพงและถ้าคุณกำลังทำมากของการทำงานในแต่ละคำขอไม่มีเหตุผลว่าทำไม 4 หรือ 8 กระบวนการไม่ควรจะพอ) ถ้าคุณแสดงเฉพาะเนื้อหาสแตติกคุณควรใช้เซิร์ฟเวอร์ที่เหมาะสำหรับการทำเช่นนั้น (Apache, ngnix, IIS)
ฌอน Vieira

2
นอกจากนี้คุณไม่ควรต้องกันทั่วไปเพื่อตัวแปรแบ่งระหว่างการร้องขอ - ถ้าคุณทำคุณจะต้องอย่างใดอย่างหนึ่งที่จะ จำกัด ตัวเองให้กระบวนการหนึ่งหรือใช้บางส่วนสื่อสารออกจากวง (Redis, ฐานข้อมูล, ระบบแฟ้มและอื่น ๆ ) ดังนั้น ว่ากระบวนการของคุณยังคงซิงค์กันอยู่
Sean Vieira

3
@ATOzTOA - หากคุณไม่สามารถหมุนเซิร์ฟเวอร์ที่ดีขึ้นได้ฉันจะปล่อยให้มันหมุนวนและดูว่าเกิดอะไรขึ้น ถ้ามันทำงานได้ไม่ดีในขณะโหลดคุณสามารถปรับใช้มันหลังเว็บเซิร์ฟเวอร์อื่น
ฌอน Vieira

2
@ATOzTOA เกี่ยวกับคำถามของคุณเกี่ยวกับสาเหตุที่คุณไม่สามารถระบุ 'เธรด' และ 'กระบวนการ' ในเวลาเดียวกันให้ใส่รหัสที่นี่: werkzeug.readthedocs.org/th/latest/_modules/werkzeug/serving
pyrho

63

การใช้วิapp.run()จากภายใน Flask สร้างเซิร์ฟเวอร์ซิงโครนัสเดียวบนเธรดเดี่ยวที่สามารถให้บริการไคลเอ็นต์ได้ครั้งละหนึ่งไคลเอ็นต์เท่านั้น มันมีไว้สำหรับใช้ในสภาพแวดล้อมการควบคุมที่มีความต้องการต่ำ (เช่นการพัฒนาการดีบัก) ด้วยเหตุผลนี้

วางไข่กระทู้และจัดการพวกเขาด้วยตัวคุณเองอาจจะไม่ได้ไปรับคุณไกลมากทั้งเพราะของงูหลาม GIL

ที่กล่าวว่าคุณยังมีตัวเลือกที่ดีอยู่บ้าง Gunicornเป็นเซิร์ฟเวอร์ WSGI ที่ใช้งานง่ายและมั่นคงซึ่งจะช่วยให้คุณวางไข่คนงานหลายคน (แยกกระบวนการดังนั้นจึงไม่ต้องกังวลกับ GIL) และยังมาพร้อมกับคนทำงานแบบอะซิงโครนัสที่จะทำให้แอปของคุณเร็วขึ้น เพื่อไม่ทำงานในส่วนของคุณ (โดยเฉพาะกับ Flask)

ถึงกระนั้นแม้แต่ Gunicorn ก็ไม่ควรเปิดเผยต่อสาธารณะโดยตรง ในการผลิตควรใช้หลังเซิร์ฟเวอร์ HTTP ที่มีประสิทธิภาพมากกว่า nginxมีแนวโน้มที่จะไปได้ดีกับ Gunicorn และ Flask


17
ไม่มาก Gunicorn เป็น python, nginx ไม่ใช่ นั่นไม่ใช่วิธีที่คุณจะใช้มัน Gunicorn จะช่วยให้คุณใช้ app ของคุณเป็นแทนgunicorn app:app 127.0.0.1:8080 python app.pyNginx จะทำหน้าที่เป็นบริการสาธารณะที่ exposes ส่วนตัวแอป Gunicorn วิ่งของคุณ(กลับ-พร็อกซี่)ซ่อนทุกประเภทของระดับที่ต่ำกว่ารายละเอียดการดำเนิน HTTP อาจจะให้บริการไฟล์คงโดยตรง ฯลฯ
ไรอัน Artecona

Flask กับ app.run (threaded = True) ทำงานได้ดีมากบน Apache2 โดยใช้ mod_wsgi flask.palletsprojects.com/en/1.1.x/deploying/mod_wsgi
MortenB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.