ฉันควรติดหรือเลิกกับ Python เพื่อจัดการกับภาวะพร้อมกันหรือไม่


31

ฉันมี 10K LOCโครงการเขียนในDjangoค่อนข้างจัดการของคื่นฉ่าย ( RabbitMQ ) สำหรับ asynchronicity และพื้นหลังงานที่จำเป็นและได้มาสรุปว่าบางส่วนของระบบที่จะได้รับประโยชน์จากการถูกเขียนใหม่ในบางสิ่งบางอย่างอื่นนอกเหนือจาก Django สำหรับการทำงานพร้อมกันดีกว่า . เหตุผลรวมถึง:

  • การจัดการสัญญาณและวัตถุที่ไม่แน่นอน โดยเฉพาะอย่างยิ่งเมื่อสัญญาณหนึ่งเรียกอีกอย่างหนึ่งการจัดการสัญญาณใน Django โดยใช้ORMนั้นน่าประหลาดใจเมื่อมีการเปลี่ยนแปลงหรือหายไป ฉันต้องการใช้วิธีการส่งข้อความบางอย่างที่ข้อมูลที่ส่งผ่านไปไม่เปลี่ยนแปลงในตัวจัดการ (วิธีการคัดลอกเมื่อเขียนของ Clojureดูดีถ้าฉันทำถูก)
  • บางส่วนของระบบไม่ได้อยู่บนเว็บและต้องการการสนับสนุนที่ดีกว่าสำหรับการปฏิบัติงานพร้อมกัน ตัวอย่างเช่นระบบอ่านแท็กNFCและเมื่อมีการอ่าน LED จะทำงานต่อไปอีกสองสามวินาที (งาน Celery) เสียงเล่น (งาน Celery อื่น ๆ ) และมีการสอบถามฐานข้อมูล (งานอื่น ๆ ) สิ่งนี้ถูกนำไปใช้เป็นคำสั่งการจัดการ Django แต่ Django และ ORM ของมันถูกซิงโครไนซ์โดยธรรมชาติและการแชร์หน่วยความจำนั้นมี จำกัด (เรากำลังคิดที่จะเพิ่มเครื่องอ่าน NFC มากขึ้นและฉันไม่คิดว่าวิธี Django + Celery ฉันต้องการดูความสามารถในการส่งข้อความที่ดียิ่งขึ้น)

อะไรคือข้อดีและข้อเสียของการใช้สิ่งที่ชอบบิดหรือพายุทอร์นาโดเมื่อเทียบกับไปสำหรับภาษาเช่นErlangหรือClojure ? ฉันสนใจในผลประโยชน์และการปฏิบัติที่เป็นอันตราย

คุณสรุปได้อย่างไรว่าบางส่วนของระบบจะดีขึ้นในภาษาอื่น? คุณกำลังมีปัญหาเรื่องประสิทธิภาพหรือไม่? ปัญหาเหล่านั้นรุนแรงเพียงใด? ถ้าสามารถเร็วกว่าจำเป็นหรือไม่ที่จะเร็วกว่า?

ตัวอย่างที่ 1: Django ที่ทำงานนอกคำขอ HTTP:

  1. อ่านแท็ก NFC แล้ว
  2. มีการสอบถามฐานข้อมูล (และอาจเป็น LDAP) และเราต้องการทำบางสิ่งเมื่อข้อมูลพร้อมใช้งาน (แสงสีแดงหรือสีเขียวเล่นเสียง) บล็อกนี้ใช้ Django ORM แต่ตราบใดที่มีคนงานขึ้นฉ่ายก็ไม่เป็นไร อาจเป็นปัญหากับสถานีเพิ่มเติม

ตัวอย่างที่ 2: “ การส่งข้อความ” โดยใช้สัญญาณ Django:

  1. post_deleteเหตุการณ์ถูกจัดการวัตถุอื่น ๆ ที่อาจมีการเปลี่ยนแปลงหรือถูกลบออกเพราะเรื่องนี้
  2. ในตอนท้ายการแจ้งเตือนควรถูกส่งไปยังผู้ใช้ ที่นี่จะเป็นการดีถ้าอาร์กิวเมนต์ที่ส่งไปยังตัวจัดการการแจ้งเตือนเป็นสำเนาของวัตถุที่ถูกลบหรือถูกลบและรับประกันว่าจะไม่เปลี่ยนแปลงในตัวจัดการ (สามารถทำได้ด้วยตนเองเพียงแค่ไม่ผ่านวัตถุที่จัดการโดย ORM ไปยังตัวจัดการ)

ฉันคิดว่าคำตอบที่ดีกว่าจะเกิดขึ้นหากคุณอธิบายเพิ่มเติมว่าทำไมคุณถึงได้ข้อสรุป
Winston Ewert

5
ก่อนที่ทุกคนจะบอกว่าคำถามเลือกภาษานั้นไม่ได้อยู่ในหัวข้อนั้นฉันจะพูดได้ว่าฉันคิดว่าสิ่งนี้ดีเพราะเป็นปัญหาที่เกิดขึ้นจริงกับข้อกำหนดเฉพาะ ฉันหวังว่ามันจะเปรียบเทียบรายละเอียดบางอย่าง
อดัมเลียร์

Twisted ตรงข้ามกับการเกิดพร้อมกัน! มันเป็นเซิร์ฟเวอร์เธรดเดี่ยวที่ถูกขับเคลื่อนเหตุการณ์มันจะไม่พาคุณไปทุกหนทุกแห่งถ้าคุณต้องการการทำงานพร้อมกันอย่างแท้จริง

คำตอบ:


35

การเปิดความคิด

คุณสรุปได้อย่างไรว่าบางส่วนของระบบจะดีขึ้นในภาษาอื่น? คุณกำลังมีปัญหาเรื่องประสิทธิภาพหรือไม่? ปัญหาเหล่านั้นรุนแรงเพียงใด? ถ้าสามารถเร็วกว่าจำเป็นหรือไม่ที่จะเร็วกว่า?

อะซิงโครนัสเธรดเดียว

มีคำถามหลายข้อและแหล่งข้อมูลบนเว็บอื่น ๆ ที่จัดการกับความแตกต่างข้อดีและข้อเสียของการซิงโครนัสแบบเธรดเดี่ยวกับการเกิดพร้อมกันแบบหลายเธรด เป็นเรื่องที่น่าสนใจที่จะอ่านว่าNode.js เป็นอย่างไรแบบอะซิงโครนัสแบบเธรดเดียวเมื่อ I / O เป็นคอขวดที่สำคัญและมีการร้องขอจำนวนมากที่ให้บริการในครั้งเดียว

Twisted, Tornado, และโมเดลอะซิงโครนัสอื่น ๆ ใช้ประโยชน์จากเธรดเดี่ยวได้อย่างยอดเยี่ยม เนื่องจากการเขียนโปรแกรมเว็บจำนวนมากมี I / O จำนวนมาก (เครือข่ายฐานข้อมูล ฯลฯ ) เวลาที่ใช้ในการรอการโทรทางไกลจึงเพิ่มขึ้นอย่างมาก นั่นคือเวลาที่สามารถใช้ในการทำสิ่งอื่น ๆ เช่นเริ่มการเรียกฐานข้อมูลอื่น ๆ การแสดงผลหน้าเว็บและการสร้างข้อมูล การใช้เธรดเดี่ยวนั้นสูงมาก

หนึ่งในผลประโยชน์ที่ยิ่งใหญ่ที่สุดของ asynchrony เดียวด้ายคือการใช้มากหน่วยความจำน้อย ในการดำเนินการหลายเธรดแต่ละเธรดต้องการหน่วยความจำสำรองจำนวนหนึ่ง เมื่อจำนวนเธรดเพิ่มขึ้นจำนวนหน่วยความจำที่ต้องการจึงมีอยู่สำหรับเธรดเท่านั้น เนื่องจากหน่วยความจำมี จำกัด จึงหมายความว่ามีขอบเขตของจำนวนเธรดที่สามารถสร้างได้ในแต่ละครั้ง


ตัวอย่าง

ในกรณีของเว็บเซิร์ฟเวอร์การแกล้งทำเป็นคำขอแต่ละครั้งจะได้รับเธรดของตัวเอง ต้องมีหน่วยความจำ 1MB สำหรับแต่ละเธรดและเว็บเซิร์ฟเวอร์มี RAM 2GB เว็บเซิร์ฟเวอร์นี้จะสามารถประมวลผลคำขอ (ประมาณ) 2000 ครั้งได้ตลอดเวลาก่อนที่จะมีหน่วยความจำไม่เพียงพอที่จะดำเนินการต่อไป

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


การทำงานพร้อมกันแบบหลายเธรด

การเกิดขึ้นพร้อมกันแบบหลายเธรดอาศัยการดำเนินงานหลายอย่างพร้อมกันแทน นั่นหมายความว่าหากเธรดถูกบล็อกรอการเรียกฐานข้อมูลเพื่อส่งคืนคำขออื่น ๆ สามารถประมวลผลได้ในเวลาเดียวกัน การใช้เธรดต่ำ แต่จำนวนเธรดที่ดำเนินการมีขนาดใหญ่กว่ามาก

โค้ดหลายเธรดก็ยากกว่าที่จะให้เหตุผล มีปัญหาเกี่ยวกับการล็อคการซิงโครไนซ์และปัญหาอื่น ๆ ที่เกิดขึ้นพร้อมกัน อะซิงโครนัสแบบเธรดเดี่ยวไม่ประสบปัญหาเดียวกัน

อย่างไรก็ตามรหัสหลายเธรดนั้นมีประสิทธิภาพมากกว่าสำหรับงานที่ต้องใช้ CPU มาก หากไม่มีโอกาสสำหรับเธรดที่จะ "ให้ผลตอบแทน" - เช่นเดียวกับการโทรผ่านเครือข่ายซึ่งปกติจะปิดกั้น - โมเดลเธรดเดี่ยวจะไม่ได้เกิดขึ้นพร้อมกันใด ๆ

ทั้งสองอยู่ร่วมกันได้

แน่นอนว่ามีการทับซ้อนกันระหว่างสองคน พวกเขาไม่ได้เป็นพิเศษร่วมกัน ตัวอย่างเช่นโค้ดหลายเธรดสามารถเขียนในลักษณะที่ไม่บล็อกเพื่อใช้ประโยชน์จากเธรดแต่ละชุดได้ดียิ่งขึ้น


บรรทัดล่าง

ยังมีอีกหลายประเด็นที่ต้องพิจารณา แต่ฉันชอบคิดเกี่ยวกับสองสิ่งนี้:

  • หากโปรแกรมของคุณถูกผูกไว้กับ I / Oดังนั้นการซิงโครไนซ์เธรดเดี่ยวอาจทำงานได้ค่อนข้างดี
  • หากโปรแกรมของคุณเชื่อมโยงกับ CPUระบบมัลติเธรดก็น่าจะดีที่สุด

ในกรณีเฉพาะของคุณคุณต้องพิจารณาว่างานอะซิงโครนัสชนิดใดที่เสร็จสมบูรณ์และความถี่ที่งานเหล่านั้นเกิดขึ้น

  • พวกเขาจะเกิดขึ้นกับทุกคำขอหรือไม่ ถ้าเป็นเช่นนั้นหน่วยความจำอาจจะกลายเป็นปัญหาเมื่อจำนวนคำขอเพิ่มขึ้น
  • สั่งงานเหล่านี้หรือไม่ถ้าเป็นเช่นนั้นคุณจะต้องพิจารณาการซิงโครไนซ์หากใช้หลายเธรด
  • งานเหล่านี้มี CPU มากหรือไม่ ถ้าเป็นเช่นนั้นเธรดเดี่ยวสามารถติดตามการโหลดได้หรือไม่?

ไม่มีคำตอบง่ายๆ คุณต้องพิจารณาว่ากรณีการใช้งานของคุณคืออะไรและออกแบบให้เหมาะสม บางครั้งแบบจำลองเธรดเดี่ยวแบบอะซิงโครนัสจะดีกว่า ในบางครั้งจำเป็นต้องใช้จำนวนเธรดเพื่อให้ได้การประมวลผลแบบขนานจำนวนมาก

ข้อควรพิจารณาอื่น ๆ

มีปัญหาอื่น ๆ ที่คุณต้องพิจารณาอีกด้วยแทนที่จะเป็นรูปแบบการทำงานพร้อมกันที่คุณเลือก คุณรู้จัก Erlang หรือ Clojure ไหม คุณคิดว่าคุณสามารถเขียนโค้ดหลายเธรดที่ปลอดภัยในภาษาใดภาษาหนึ่งเหล่านี้เช่นที่คุณปรับปรุงประสิทธิภาพของแอปพลิเคชันของคุณหรือไม่? มันจะใช้เวลานานในการเพิ่มความเร็วในภาษาเหล่านี้และภาษาที่คุณเรียนรู้จะเป็นประโยชน์กับคุณในอนาคตหรือไม่

แล้วปัญหาเกี่ยวกับการสื่อสารระหว่างระบบทั้งสองนี้ล่ะ? มันจะซับซ้อนเกินกว่าที่จะรักษาระบบแยกกันสองระบบพร้อมกันหรือไม่? ระบบ Erlang จะรับงานจาก Django ได้อย่างไร Erlang จะสื่อสารผลลัพธ์เหล่านั้นกลับไปที่ Django อย่างไร ประสิทธิภาพมีความสำคัญเพียงพอสำหรับปัญหาที่ความซับซ้อนที่เพิ่มเข้ามามีค่าหรือไม่?


ความคิดสุดท้าย

ฉันพบเสมอว่า Django รวดเร็วพอและถูกใช้โดยไซต์ที่ถูกค้ามนุษย์จำนวนมาก มีการปรับประสิทธิภาพให้เหมาะสมหลายประการที่คุณสามารถทำได้เพื่อเพิ่มจำนวนคำขอพร้อมกันและเวลาตอบสนอง เป็นที่ยอมรับว่าฉันยังไม่ได้ทำอะไรกับ Celery ในตอนนี้ดังนั้นการเพิ่มประสิทธิภาพตามปกติอาจไม่สามารถแก้ไขปัญหาใด ๆ ที่คุณอาจมีกับงานแบบอะซิงโครนัสเหล่านี้

แน่นอนว่ายังมีข้อเสนอแนะในการทิ้งปัญหาฮาร์ดแวร์เพิ่มเติม ต้นทุนของการจัดเตรียมเซิร์ฟเวอร์ใหม่ราคาถูกกว่าต้นทุนการพัฒนาและบำรุงรักษาระบบย่อยใหม่ทั้งหมดหรือไม่?

ฉันได้ถามคำถามมากเกินไปในตอนนี้ แต่นั่นเป็นความตั้งใจของฉัน คำตอบนั้นจะไม่ง่ายหากไม่มีการวิเคราะห์และรายละเอียดเพิ่มเติม ความสามารถในการวิเคราะห์ปัญหาเกิดขึ้นได้เมื่อรู้ถึงคำถามที่ถาม แต่หวังว่าฉันจะช่วยได้

ความรู้สึกของฉันบอกว่าการเขียนภาษาอื่นไม่จำเป็น ความซับซ้อนและค่าใช้จ่ายอาจจะมากเกินไป


แก้ไข

ตอบสนองต่อการติดตาม

การติดตามของคุณนำเสนอกรณีการใช้งานที่น่าสนใจมาก


1. Django ทำงานนอกคำขอ HTTP

ตัวอย่างแรกของคุณเกี่ยวข้องกับการอ่านแท็ก NFC จากนั้นทำการสืบค้นฐานข้อมูล ฉันไม่คิดว่าการเขียนส่วนนี้ในภาษาอื่นจะเป็นประโยชน์กับคุณเพียงเพราะการสืบค้นฐานข้อมูลหรือเซิร์ฟเวอร์ LDAP กำลังถูกผูกมัดโดยเครือข่าย I / O (และประสิทธิภาพของฐานข้อมูลที่อาจเกิดขึ้น) ในทางกลับกันจำนวนของคำร้องขอที่เกิดขึ้นพร้อมกันจะถูกผูกไว้กับเซิร์ฟเวอร์เนื่องจากแต่ละคำสั่งการจัดการจะถูกเรียกใช้เป็นกระบวนการของตัวเอง จะมีเวลาการตั้งค่าและการฉีกขาดที่ส่งผลต่อประสิทธิภาพเนื่องจากคุณไม่ได้ส่งข้อความไปยังกระบวนการที่กำลังทำงานอยู่ อย่างไรก็ตามคุณจะสามารถส่งคำขอได้หลายรายการพร้อมกันเนื่องจากแต่ละรายการจะเป็นกระบวนการแยก

สำหรับกรณีนี้ฉันเห็นช่องทางสองทางที่คุณสามารถตรวจสอบได้:

  1. ตรวจสอบให้แน่ใจว่าฐานข้อมูลของคุณสามารถจัดการแบบสอบถามหลายรายการพร้อมกันด้วยการรวมการเชื่อมต่อ (ตัวอย่างเช่น Oracle ต้องการให้คุณกำหนดค่า Django ตามลำดับ'OPTIONS': {'threaded':True}) อาจมีตัวเลือกการกำหนดค่าที่คล้ายกันในระดับฐานข้อมูลหรือระดับ Django ที่คุณสามารถปรับแต่งสำหรับฐานข้อมูลของคุณเอง ไม่ว่าคุณจะเขียนคำสืบค้นฐานข้อมูลในภาษาใดคุณจะต้องรอให้ข้อมูลนี้กลับมาก่อนจึงจะสามารถติดไฟ LED ได้ ประสิทธิภาพของรหัสการสืบค้นสามารถสร้างความแตกต่างได้และ Django ORM นั้นไม่เร็วนัก ( แต่มักเร็วพอ)
  2. ลดเวลาการตั้งค่า / การย่อขนาด มีกระบวนการที่ทำงานอยู่ตลอดเวลาและส่งข้อความถึงมัน (แก้ไขให้ฉันถ้าฉันผิด แต่นี่คือสิ่งที่คำถามดั้งเดิมของคุณกำลังจดจ่ออยู่) กระบวนการนี้เขียนใน Python / Django หรือภาษา / กรอบงานอื่นครอบคลุมอยู่ด้านบนหรือไม่ ฉันไม่ชอบแนวคิดของการใช้คำสั่งการจัดการบ่อยครั้ง เป็นไปได้ไหมที่จะมีโค้ดขนาดเล็กทำงานอยู่ตลอดเวลาซึ่งส่งข้อความจากเครื่องอ่าน NFC ไปยังคิวข้อความซึ่ง Celery อ่านแล้วส่งต่อไปยัง Django หรือไม่ การตั้งค่าและการลดขนาดของโปรแกรมขนาดเล็กแม้ว่าจะเขียนใน Python (แต่ไม่ใช่ Django!) ก็ควรจะดีกว่าการเริ่มต้นและหยุดโปรแกรม Django (พร้อมระบบย่อยทั้งหมด)

ฉันไม่แน่ใจว่าคุณใช้เว็บเซิร์ฟเวอร์ใดสำหรับ Django mod_wsgiสำหรับ Apache ให้คุณกำหนดจำนวนกระบวนการและเธรดภายในกระบวนการที่ให้บริการร้องขอ โปรดปรับแต่งการกำหนดค่าที่เกี่ยวข้องของเว็บเซิร์ฟเวอร์ของคุณเพื่อปรับจำนวนคำขอที่สามารถให้บริการได้


2. “ Message-through” พร้อมสัญญาณ Django

กรณีใช้งานครั้งที่สองของคุณก็น่าสนใจเช่นกัน ฉันไม่แน่ใจว่าฉันมีคำตอบสำหรับสิ่งนั้นหรือไม่ หากคุณกำลังลบกรณีรูปแบบและความปรารถนาที่จะดำเนินการกับพวกเขาต่อมามันอาจจะเป็นไปได้ที่จะเป็นอันดับพวกเขาJSON.dumpsแล้ว JSON.loadsdeserialize มันจะเป็นไปไม่ได้ที่จะสร้างกราฟออบเจ็กต์ใหม่อย่างสมบูรณ์ในภายหลัง (การสอบถามรุ่นที่เกี่ยวข้อง) เนื่องจากฟิลด์ที่เกี่ยวข้องนั้นถูกโหลดจากฐานข้อมูลที่ขี้เกียจและลิงก์นั้นจะไม่มีอยู่อีกต่อไป

ตัวเลือกอื่นจะทำเครื่องหมายวัตถุสำหรับการลบอย่างใดและลบเฉพาะเมื่อสิ้นสุดรอบการร้องขอ / ตอบกลับ (หลังจากสัญญาณทั้งหมดได้รับการบริการ) post_deleteมันอาจจะต้องใช้สัญญาณที่กำหนดเองในการดำเนินการนี้แทนที่จะอาศัย


1
FUD และข้อสงสัยมากมายเกี่ยวกับการล็อกและสิ่งอื่น ๆ ที่ไม่ใช่ปัญหาของ Erlang ไม่มีปัญหาสถานะแชร์แบบดั้งเดิมที่คุณแสดงรายการเป็นข้อควรพิจารณาเกี่ยวกับภาษาและรันไทม์ที่ออกแบบมาเป็นพิเศษเพื่อไม่ให้ใช้สถานะร่วมกัน Erlang สามารถจัดการกระบวนการที่รอบคอบนับหมื่นในหน่วยความจำน้อยมากความดันหน่วยความจำก็ไม่เป็นปัญหาเช่นกัน

@ Jarrod ฉันเองไม่รู้จัก Erlang ดังนั้นฉันจะยอมรับสิ่งที่คุณพูดในเรื่องนั้น มิฉะนั้นเกือบทุกอย่างอื่นที่ฉันกล่าวถึงมีความเกี่ยวข้อง ค่าใช้จ่ายความซับซ้อนและไม่ว่าจะเป็นเครื่องมือในปัจจุบันมีการใช้อย่างถูกต้องหรือไม่
Josh Smeaton

Node.js ไม่ได้เป็นเกลียวเดียว
Robert Harvey

นี่เป็นคำตอบที่ยิ่งใหญ่ที่ฉันชอบอ่าน ^^ +1 ดีมาก!
Laurent Bourgault-Roy

นอกจากนี้หากคุณมีแม่แบบ DJango พวกเขาสามารถใช้ใน erlang กับ Erlydtl
Zachary K

8

ฉันได้บางที่มีความซับซ้อนมากการพัฒนาปรับขนาดได้อย่างเป็นยักษ์ใหญ่ในสหรัฐISP เราได้หมายเลข tranasaction บางอย่างโดยใช้บิดเซิร์ฟเวอร์และมันเป็นฝันร้ายของความซับซ้อนที่จะได้รับหลาม / Twisted ขนาดในสิ่งที่เป็นซีพียูที่ถูกผูกไว้ การผูก I / Oไม่ใช่ปัญหา แต่การเชื่อมโยง CPU นั้นเป็นไปไม่ได้ เราสามารถรวบรวมระบบต่าง ๆ ได้อย่างรวดเร็ว แต่การทำให้ผู้ใช้งานพร้อมกันหลายล้านคนกลายเป็นฝันร้ายของการกำหนดค่าและความซับซ้อนหากถูก จำกัด ด้วย CPU

ผมเขียนขึ้นบล็อกโพสต์เกี่ยวกับเรื่องนี้หลาม / Twisted VS Erlang

TLDR; Erlangชนะ


4

ปัญหาในทางปฏิบัติกับTwisted (ซึ่งฉันรักและใช้มาประมาณห้าปี):

  1. เอกสารประกอบเป็นสิ่งที่ต้องการและแบบจำลองค่อนข้างซับซ้อนในการเรียนรู้ต่อไป ฉันพบว่ามันยากที่จะให้โปรแกรมเมอร์ Python อื่น ๆ ทำงานกับรหัส Twisted
  2. ฉันสิ้นสุดการใช้ไฟล์การบล็อก I / O และการเข้าถึงฐานข้อมูลเนื่องจากขาด API การบล็อกที่ดี นี่อาจเป็นอันตรายต่อประสิทธิภาพการทำงาน
  3. ดูเหมือนจะไม่มีชุมชนขนาดใหญ่และชุมชนที่มีสุขภาพดีโดยใช้ Twisted เช่นNode.jsมีการพัฒนาอย่างต่อเนื่องโดยเฉพาะอย่างยิ่งสำหรับการเขียนโปรแกรมเว็บแบ็คเอนด์
  4. มันยังคงเป็น Python และอย่างน้อยCPythonไม่ใช่สิ่งที่เร็วที่สุด

ฉันได้ทำงานเล็กน้อยโดยใช้ Node.js กับCoffeeScriptและหากประสิทธิภาพที่เกิดขึ้นพร้อมกันนั้นเป็นสิ่งที่คุณกังวล

คุณเคยลองใช้Djangoหลายอินสแตนซ์โดยมีข้อตกลงบางอย่างเพื่อกระจายลูกค้าระหว่างอินสแตนซ์หรือไม่?


1
เอกสารหลามทั่วไปบางสิ่งบางใบเป็นที่ต้องการ: / (ไม่บอกว่ามันเป็นเรื่องที่ไม่ดี แต่สำหรับภาษาที่นิยมหนึ่งจะคาดหวังให้มันเป็นจำนวนมากที่ดีกว่า)
โกง

3
ฉันพบเอกสาร Python และเอกสารเฉพาะของ Django เป็นเอกสารที่ดีที่สุดสำหรับมือที่ใช้ภาษาใด ๆ ห้องสมุดบุคคลที่สามหลายแห่งปล่อยให้สิ่งที่ต้องการ
Josh Smeaton

1

ฉันจะแนะนำสิ่งต่อไปนี้ก่อนที่คุณจะพิจารณาเปลี่ยนเป็นภาษาอื่น

  1. ใช้LTTngเพื่อบันทึกเหตุการณ์ของระบบเช่นข้อผิดพลาดของหน้าสวิตช์บริบทและการรอสายของระบบ
  2. แปลงที่ใดก็ตามที่ใช้เวลามากเกินไปในการใช้ไลบรารี C และใช้รูปแบบการออกแบบใด ๆ ที่คุณชอบ (มัลติเธรดการส่งสัญญาณตามเหตุการณ์ call back async หรือ Unix ดั้งเดิมselect) ซึ่งดีสำหรับ I / O ในนั้น

ฉันจะไม่ใช้เธรดใน Python เมื่อแอปพลิเคชันมีความสำคัญในประสิทธิภาพ ฉันจะใช้ตัวเลือกข้างต้นซึ่งสามารถแก้ปัญหาได้หลายอย่างเช่นการใช้ซอฟต์แวร์ซ้ำการเชื่อมต่อกับDjangoประสิทธิภาพการทำงานง่ายต่อการพัฒนาเป็นต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.