ฉันรู้ว่าฉันสามารถเชื่อมโยง Flask กับ Apache หรือเว็บเซิร์ฟเวอร์อื่น ๆ ได้ แต่ฉันคิดว่าการใช้ Flask เป็นเซิร์ฟเวอร์แบบสแตนด์อโลนที่ให้บริการลูกค้าหลายรายพร้อมกัน
เป็นไปได้ไหม ฉันต้องจัดการกับการวางไข่หลายเธรดและจัดการได้อย่างไร
ฉันรู้ว่าฉันสามารถเชื่อมโยง Flask กับ Apache หรือเว็บเซิร์ฟเวอร์อื่น ๆ ได้ แต่ฉันคิดว่าการใช้ Flask เป็นเซิร์ฟเวอร์แบบสแตนด์อโลนที่ให้บริการลูกค้าหลายรายพร้อมกัน
เป็นไปได้ไหม ฉันต้องจัดการกับการวางไข่หลายเธรดและจัดการได้อย่างไร
คำตอบ:
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 คนพร้อมกัน) ตรวจสอบให้แน่ใจว่าได้ยืนอยู่ด้านหลังเว็บเซิร์ฟเวอร์จริงตัวเลือกการปรับใช้สำหรับวิธีการที่แนะนำ)
การใช้วิapp.run()
จากภายใน Flask สร้างเซิร์ฟเวอร์ซิงโครนัสเดียวบนเธรดเดี่ยวที่สามารถให้บริการไคลเอ็นต์ได้ครั้งละหนึ่งไคลเอ็นต์เท่านั้น มันมีไว้สำหรับใช้ในสภาพแวดล้อมการควบคุมที่มีความต้องการต่ำ (เช่นการพัฒนาการดีบัก) ด้วยเหตุผลนี้
วางไข่กระทู้และจัดการพวกเขาด้วยตัวคุณเองอาจจะไม่ได้ไปรับคุณไกลมากทั้งเพราะของงูหลาม GIL
ที่กล่าวว่าคุณยังมีตัวเลือกที่ดีอยู่บ้าง Gunicornเป็นเซิร์ฟเวอร์ WSGI ที่ใช้งานง่ายและมั่นคงซึ่งจะช่วยให้คุณวางไข่คนงานหลายคน (แยกกระบวนการดังนั้นจึงไม่ต้องกังวลกับ GIL) และยังมาพร้อมกับคนทำงานแบบอะซิงโครนัสที่จะทำให้แอปของคุณเร็วขึ้น เพื่อไม่ทำงานในส่วนของคุณ (โดยเฉพาะกับ Flask)
ถึงกระนั้นแม้แต่ Gunicorn ก็ไม่ควรเปิดเผยต่อสาธารณะโดยตรง ในการผลิตควรใช้หลังเซิร์ฟเวอร์ HTTP ที่มีประสิทธิภาพมากกว่า nginxมีแนวโน้มที่จะไปได้ดีกับ Gunicorn และ Flask
gunicorn app:app 127.0.0.1:8080
python app.py
Nginx จะทำหน้าที่เป็นบริการสาธารณะที่ exposes ส่วนตัวแอป Gunicorn วิ่งของคุณ(กลับ-พร็อกซี่)ซ่อนทุกประเภทของระดับที่ต่ำกว่ารายละเอียดการดำเนิน HTTP อาจจะให้บริการไฟล์คงโดยตรง ฯลฯ
processes=100
และมีความสุขกับมันได้หรือไม่ ในกรณีของฉันฉันต้องการไฟล์คงที่ไม่มีวิธีการโพสต์ HTTP ความต้องการของฉันคือฉันต้องการเรียกใช้ Flask เธรดทั้งหมดซึ่งเป็นส่วนหนึ่งของแอพแม่ของฉันเพื่อให้พวกเขาทั้งหมดสามารถแชร์ตัวแปรได้