เมื่อใดที่ใช้ทอร์นาโดเมื่อใช้ Twisted / Cyclone / GEvent / อื่น ๆ [ปิด]


181

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

มันจะดีถ้ามันจะให้การทำงานที่ดี(websockets, rpc, สตรีมมิ่งและอื่น ๆ )

อะไรคือข้อดีข้อเสียของแต่ละวิธี?


จำเป็นต้องเป็นหนึ่งในกรอบงานเหล่านี้หรือไม่? คุณวางแผนที่จะทำอะไรและสามารถทำอะไรได้บ้างเช่น Django, Pylons ฯลฯ ...
Joe Doherty

ไม่แน่นอนไม่ แต่ฉันจะรักถ้ามันจะไม่ตรงกันและจะได้รับการสนับสนุนที่ดีสำหรับ websockets - ฉันได้ปรับปรุงคำถามด้วย ขอบคุณ.
วอยชิ

3
เรียงคำถามกว้าง ๆ ใช่มั้ย
Jean-Paul Calderone

ทางเลือกของคุณขึ้นอยู่กับห้องสมุดที่คุณต้องการใช้ ห้องสมุดของคุณ - ตามภารกิจที่คุณต้องการแก้ไข
Nikolay Fominyh

1
ใช่มันกว้าง แต่อาจใช้การได้ ฉันสงสัยว่าห้องสมุดเหล่านี้มีการใช้งานจริงหรือไม่และใครบางคนที่ใช้ห้องสมุดเหล่านี้ทุกวันสามารถบอกได้ว่าสิ่งไหนดีสำหรับพวกเขาสิ่งที่ขาด ฯลฯ สิ่งที่ควรเป็นพื้นฐานในการเลือกห้องสมุด - อาจเป็น Twisted เห็นด้วยกับการคิดค่าเสื่อมราคาเมื่อพูดถึง Autobahn หรือ Cyclone? หรือ mmaybe Autobahn และ Cyclone ยังไม่พร้อมสำหรับการผลิตและการบำรุงรักษาของมันอยู่ภายใต้คำถาม? หรือบางทีทอร์นาโดมีการออกแบบที่ทันสมัยมากขึ้นและในอนาคตมันอาจจะเปล่งประกายและยิ่งใหญ่และมันควรเป็นตัวเลือกสำหรับโครงการเริ่มต้นหรือไม่
Wojciech Danilo

คำตอบ:


226

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

" ขวดเป็น microframework สำหรับงูใหญ่อยู่บนพื้นฐานของ Werkzeug, Jinja 2 และความตั้งใจที่ดี" ระวัง - "การทำไมโครบล็อก" อาจทำให้เข้าใจผิด นี่ไม่ได้หมายความว่า Flask เป็นห้องสมุดที่มีผู้ใช้เพียงคนเดียว นี่หมายความว่าแก่นของขวดนั้นง่ายมาก ไม่เหมือน Django มันจะไม่ทำการตัดสินใจทางเทคโนโลยีใด ๆ สำหรับคุณ คุณมีอิสระที่จะเลือกเอ็นจินเทมเพลตหรือออมที่คุณต้องการ แม้ว่ามันจะมาพร้อมกับเอ็นจิ้นแม่แบบ Jinja โดยค่าเริ่มต้นคุณมีอิสระในการเลือกของเราเอง เท่าที่ฉันรู้ Flask มีประโยชน์สำหรับการเขียนจุดปลายทาง API (บริการ RESTful)

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

" Tornadoเป็นเฟรมเวิร์กเว็บ Python และไลบรารีเครือข่ายแบบอะซิงโครนัสซึ่งพัฒนาขึ้นที่ FriendFeed โดยการใช้ I / O เครือข่ายที่ไม่มีการบล็อกทอร์นาโดสามารถปรับขยายการเชื่อมต่อแบบเปิดได้เป็นหมื่น ๆ ที่จำเป็นต้องมีการเชื่อมต่อระยะยาวให้กับผู้ใช้แต่ละคน" พายุทอร์นาโดย่อมาจากบางที่ระหว่าง Django และ Flask หากคุณต้องการเขียนอะไรบางอย่างกับ Django หรือ Flask แต่ถ้าคุณต้องการประสิทธิภาพที่ดีกว่าคุณสามารถเลือก Tornado มันสามารถจัดการกับปัญหา C10k ได้เป็นอย่างดีถ้ามันถูกออกแบบมาให้ถูกต้อง

" พายุไซโคลนเป็นกรอบเว็บเซิร์ฟเวอร์สำหรับงูหลามที่ดำเนินทอร์นาโด API เป็นโปรโตคอลบิด" ทีนี้ถ้าคุณต้องการบางสิ่งที่ใกล้เคียงกับนักแสดงอย่าง Twisted แต่ง่ายที่จะเขียน webapps ทั่วไป? ทักทายพายุไซโคลน ฉันต้องการ Cyclone มากกว่า Tornado มันมี API ที่คล้ายกับ Tornado มาก ตามจริงแล้วนี่คือทางแยกของพายุทอร์นาโด แต่ปัญหาคือมันมีชุมชนเล็ก ๆ ที่เกี่ยวข้อง Alexandre Fiori เป็นผู้เดินทางหลักเพียงคนเดียวในการซื้อคืน

" Pyramidเป็นเฟรมเวิร์กการพัฒนาแอปพลิเคชันทั่วไปของ Python เว็บโอเพนซอร์ซเป้าหมายหลักของมันคือการทำให้ผู้พัฒนา Python สร้างเว็บแอปพลิเคชันได้ง่ายขึ้น" ฉันไม่ได้ใช้พีระมิดจริงๆ แต่ฉันได้อ่านเอกสาร จากสิ่งที่ฉันเข้าใจ Pyramid นั้นคล้ายกับFlask มากและฉันคิดว่าคุณสามารถใช้ Pyramid ได้ทุกที่ที่ดูเหมือนว่าFlaskเหมาะสมและกลับกัน

แก้ไข : ขอให้ตรวจสอบกรอบอื่น ๆ ได้รับการต้อนรับ!

ที่มา: http://dhilipsiva.com/2013/05/19/python-l ไลบรารี-django-twisted-tornado-flask-cyclone-and-pyramid.html


1
Django เป็นกรอบที่ฉันชอบ มันเป็นเอกสารที่ดีมากและ ORM นั้นง่าย ภาคใต้นั้นยอดเยี่ยมสำหรับการโยกย้ายสคีมาฐานข้อมูล .... แต่คำถามมีดังนี้: "ฉันชอบที่จะมีเว็บเซิร์ฟเวอร์แบบอะซิงโครนัสซึ่งจะทำให้ฉันขยายขนาดได้อย่างง่ายดาย" Django ถูกสร้างขึ้นสำหรับไซต์การร้องขอ + การตอบกลับแบบดั้งเดิมไม่ใช่สำหรับ async
guettli

1
คุณช่วยเขียนเกี่ยวกับ Pyramid ได้ไหม?
Fizer Khan

5
@FizerKhan: ตามคำขอของคุณฉันได้อัพเดตคำตอบแล้ว ขออภัยมันใช้เวลานานมาก ไม่มีเวลาที่จะใช้พีระมิด แต่ฉันอ่านเอกสาร
dhilipsiva

1
ฉันจะเพิ่มว่าสภาพแวดล้อมแบบเธรดเดียวที่พายุทอร์นาโดใช้นั้นมีแนวโน้มที่จะเกิดข้อผิดพลาดมากกว่า - ข้อผิดพลาดที่ทำให้โค้ดสำหรับจุดปลาย API เดียวช้าลงจะทำให้เกิดปัญหาสำหรับจุดปลายทั้งหมดได้อย่างง่ายดาย
Abel Molina

1
คุณสามารถแสดงความคิดเห็นใน cherrypy ได้หรือไม่?
Stavros Avramidis

60

เห็นได้ชัดว่านี่เป็นคำตอบที่ค่อนข้างลำเอียงแต่นั่นไม่ใช่สิ่งเดียวกับคำตอบที่ผิด คุณควรใช้ Twisted ฉันได้ตอบคำถามที่คล้ายกันมาก่อน แต่เนื่องจากคำถามของคุณไม่เหมือนกันนี่คือเหตุผลบางประการ:

"ประสิทธิภาพที่ดีที่สุด"

Twisted ตรวจสอบประสิทธิภาพของเราอย่างต่อเนื่องที่เว็บไซต์speed.twistedmatrix.com เราเป็นหนึ่งในโครงการแรกที่ได้รับการตรวจสอบโดยไซต์ที่คล้ายกันของ PyPyดังนั้นจึงมั่นใจได้ถึงประสิทธิภาพที่ดีของ Twisted ในรันไทม์ที่ทุกคนที่เกี่ยวข้องกับแอปพลิเคชั่นประสิทธิภาพสูงใน Python

"การปรับขยาย"

สำหรับความรู้ของฉันไม่มีเฟรมเวิร์กที่ระบุไว้ใด ๆ ที่มีการสนับสนุนในตัวสำหรับการปรับสเกลอัตโนมัติ เป็นกรอบการสื่อสารทั้งหมดดังนั้นคุณต้องทำงานเพื่อสื่อสารระหว่างโหนดการปรับสเกลของคุณ อย่างไรก็ตาม Twisted มีข้อได้เปรียบในการรองรับการประมวลผลแบบหลายตัวในตัว ในความเป็นธรรมมีส่วนเสริมของบุคคลที่สามสำหรับ Tornadoที่ให้คุณทำสิ่งเดียวกันได้ ในรุ่นล่าสุดTwisted ได้เพิ่มฟีเจอร์ที่เพิ่มจำนวนวิธีที่คุณสามารถแชร์งานระหว่างคอร์และการทำงานยังคงดำเนินต่อไปในพื้นที่นั้น บิดนอกจากนี้ยังมีคู่ของดีแบบบูรณา , "แม่"โปรโตคอล RPC ซึ่งมีการก่อสร้างชุดสำหรับสิ่งที่สำนวนการปรับขนาดที่คุณต้องการที่จะไล่ตาม

"มีประโยชน์มากที่สุด"

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

"การทำงาน"

Twisted ประกอบด้วย:

ในแผนกสุดท้ายนี้อย่างน้อย Twisted ดูเหมือนจะเป็นผู้ชนะที่ชัดเจนสำหรับการใช้งานในตัว และทั้งหมดนี้ในแพ็คเกจเพียง 2 เมกะไบต์!


6
ทำไมผู้คนมากมายพูดว่าพวกเขาไม่ได้ใช้ Twisted แต่เป็น GEvent อีกต่อไป
remdezx

1
มีคนจำนวนมากบอกว่าเป็นการยากที่จะรักษาแอปพลิเคชันขนาดใหญ่โดยใช้ Twisted (เนื่องจากสถาปัตยกรรมการโทรกลับ): stackoverflow.com/questions/3048012/ ...... การใช้ gevent หรือ gevent จาก Twisted นั้นดีกว่าไหม?
วอยชิ

8
@remdezx ตามคำถามของคุณมีสองเหตุผล หนึ่งคือผู้คนพบว่า Twisted เข้าใจยากเพราะการเขียนโปรแกรมพร้อมกันยากที่จะเข้าใจ จากนั้นพวกเขาเปลี่ยนมาใช้ GEvent เพราะเข้าใจง่ายมาก - ตราบใดที่ไม่มีการทำงานพร้อมกันทุกอย่างทำงานเหมือนที่คุณคาดหวัง อีกเหตุผลหนึ่งก็คือมันทำงานได้น้อยกว่าในการแปลงรหัสไปยัง GEvent ซึ่งไม่ได้เขียนขึ้นโดยใช้ event-driven API เพื่อรับประโยชน์ด้านประสิทธิภาพของ I / O ที่ขับเคลื่อนด้วยเหตุการณ์ หากรหัสของคุณไม่เปิดเผยสถานะมากเกินไปพอร์ตดังกล่าวอาจทำงานได้ดี
Glyph

1
@ glyph, คุณกำลังพูดถึงการทำงานพร้อมกัน แต่ ... ทั้ง Gevent และ Twisted support concurrency (แน่นอนคุณสามารถใช้การประมวลผลแบบทวีคูณกับ gevent และใช้กลุ่มของเธรดจริงและพูลของกรีนเล็ตในแต่ละเธรดซึ่งใช้ได้ดีสำหรับฉันและ คุณสามารถใช้ปลั๊กอิน Twisted เพื่อทำสิ่งเดียวกัน - รันหลาย ๆ intents ที่อยู่ติดกัน) แต่ Twisted gices คุณมีอะไรมากกว่า gevent หรือไม่? ฉันคิดว่าแม้จะมีหลายกรณีของ gevent / twisted, gevent นั้นง่ายต่อการขีดเส้นใต้และไม่มีการเรียกกลับ io ที่ชัดเจน ฉันพลาดอะไรไปรึเปล่า?
วอยชิ

2
@ danilo2 ใช่คุณหายไปอย่างน้อยหนึ่งอย่าง :) โดยเฉพาะอย่างยิ่งคุณเข้าใจผิดคำว่า "การทำงานพร้อมกัน" เพื่อหมายถึง "การดำเนินการแบบขนานพร้อมกันบน CPU หลายตัว" Twisted สามารถกำหนดเวลา I / O ได้พร้อมกันผ่านทาง I / O แบบอะซิงโครนัส GEvent สามารถกำหนดการตั้งเวลา I / O ได้พร้อมกันผ่านตัวกำหนดตารางเวลาไมโครกระทู้ ใน Twisted การใช้spawnProcessการกำหนดเวลา I / O นี้สามารถแปลเป็นการกำหนดเวลา CPU ได้เช่นกัน
Glyph

48

ฉันชอบ @Glyph response Twisted เป็นโครงร่างหลามที่สมบูรณ์และครอบคลุมมาก Twisted and Tornado มีการออกแบบที่คล้ายกันมาก และฉันชอบการออกแบบนี้มาก:

  • มันรวดเร็ว
  • เข้าใจง่าย
  • ง่ายต่อการขยาย
  • ไม่ต้องการc-extensions
  • ทำงานบน PyPy

แต่ฉันต้องการเน้นทอร์นาโดซึ่งฉันชอบและเพิ่งได้รับความนิยม ทอร์นาโดเช่น Twisted ใช้การเขียนโปรแกรมสไตล์การโทรกลับ แต่สามารถ inline ใช้tornado.gen.engine( twisted.internet.inlineCallbacksใน Twisted)

codebase

ความคิดเห็นที่ดีที่สุดมาจากเว็บไซต์http://cyclone.io พายุไซโคลนพยายามที่จะผสม Twisted และ Tornado เพราะ:

Twisted เป็นหนึ่งในห้องสมุดที่เป็นผู้ใหญ่ที่สุดสำหรับการไม่ปิดกั้น I / O ให้กับสาธารณะ Tornado เป็นเวอร์ชันโอเพ่นซอร์สของเว็บเซิร์ฟเวอร์ของ FriendFeed ซึ่งเป็นหนึ่งในเว็บเซิร์ฟเวอร์ที่ได้รับความนิยมและรวดเร็วที่สุดสำหรับ Python ด้วย API ที่เหมาะสมอย่างยิ่งสำหรับการสร้างเว็บแอปพลิเคชัน

แนวคิดคือเชื่อมสะพาน API ที่สวยงามและตรงไปตรงมาของ Tornado ไปยัง Event-Loop ของ Twisted ซึ่งทำให้รองรับโปรโตคอลจำนวนมาก

แต่ในปี 2011 tornado.platform.twistedก็ออกมาซึ่งนำฟังก์ชั่นที่คล้ายกัน

ประสิทธิภาพ

Tornado นั้นมีประสิทธิภาพที่ดีกว่ามาก มันยังทำงานได้อย่างราบรื่นกับ PyPy และได้รับผลประโยชน์มหาศาล

scalability

เช่นเดียวกับ Twisted ทอร์นาโดมีtornado.processและบริการ rpc จำนวนมากติดตั้งอยู่ด้านบน

ฟังก์ชั่น

มีแพ็คเกจทอร์นาโด71ชุดเทียบกับ 148 Twisted และ 48 Gevent แต่ถ้าคุณดูอย่างระมัดระวังและคำนวณค่ามัธยฐานของเวลาอัพโหลดแพ็กเกจคุณจะเห็นว่า Twisted นั้นเก่าที่สุดแล้ว Gevent และ Tornado ที่สดใหม่ที่สุด นอกจากนี้ยังมีtornado.platform.twistedโมดูลที่ช่วยให้คุณใช้รหัสที่เขียนขึ้นสำหรับบิดบนทอร์นาโด

สรุป

ด้วย Tornado คุณสามารถใช้รหัสจาก Twisted ไม่จำเป็นต้องใช้พายุไซโคลนซึ่งเพียงบิดรหัสของคุณ (รหัสของคุณกลายเป็นยุ่งมากขึ้น)

สำหรับปี 2014 Tornado ถือเป็นเฟรมเวิร์ก async ที่เป็นที่ยอมรับอย่างกว้างขวางและเป็นค่าเริ่มต้นซึ่งทำงานได้ทั้งบน python2 และ python3 นอกจากนี้ยังมีรุ่น 4.x ล่าสุดนำจำนวนมากของการทำงานจากhttps://docs.python.org/dev/library/asyncio.html

ฉันเขียนบทความอธิบายว่าทำไมฉันถึงพิจารณาว่าTornado - กรอบงาน Python บนเว็บที่ดีที่สุดที่ฉันเขียนเกี่ยวกับฟังก์ชันการทำงานของ Tornado


15

( ปรับปรุง : ฉันประหลาดใจเศร้าเกี่ยวกับคำแนะนำที่นี่ไม่กี่คำแนะนำหรือแม้กระทั่งพูดถึง Gevent - ฉันไม่คิดว่ามันเป็นสัดส่วนกับความนิยมประสิทธิภาพและความสะดวกในการใช้งานห้องสมุดที่ยอดเยี่ยมนี้!)

Gevent และ Twisted นั้นไม่ได้มีลักษณะเฉพาะตัวซึ่งกันและกันถึงแม้ว่าในทางกลับกันอาจดูเหมือนชัดเจนในตอนแรก มีโครงการที่เรียกว่าgeventreactorซึ่งช่วยให้คนหนึ่งสามารถใช้ประโยชน์จากทั้งสองโลกได้อย่างราบรื่นที่สุดคือ:

  • แบบจำลองเธรดที่มีประสิทธิภาพและราคาถูก (สีเขียวแบบมีส่วนร่วม) ของ Gevent ซึ่งเป็นโปรแกรมที่ง่ายกว่ามากเมื่อพูดถึงการทำงานพร้อมกัน - ตรงไปตรงมา Twisted's inlineCallbacksไม่ได้ขึ้นอยู่กับงานในแง่ของประสิทธิภาพเมื่อมาถึงหลาย coroutines เงื่อนไขความง่าย / ความโปร่งใสในการใช้งาน: yieldและDeferredsทุกที่; มักจะยากที่จะสร้าง abstractions; ร่องรอยสแต็คที่ไร้ประโยชน์ horrifyingly กับทั้งเปลือยตลอดจนและมากยิ่งขึ้นเพื่อให้มีการDeferred@inlineCallbacks
  • ทุกตัวในการทำงานของบิดที่คุณเคยได้ฝันของรวมถึง แต่ไม่ จำกัด IReactorProcess.spawnProcessเพียง

ตอนนี้ฉันใช้ Gevent 1.0rc2 กับ Twisted 12.3 โดยgeventreactorส่วนตัวแล้ว ฉันได้ดำเนินการของตัวเองเป็นของที่ยังไม่ได้ตีพิมพ์เพิ่มเติมและปรับปรุงเพื่อgeventreactorที่ฉันจะเผยแพร่ในเร็ว ๆ นี้หวังว่าจะเป็นส่วนหนึ่งของgeventreactor's พื้นที่เก็บข้อมูล GitHub เดิม: https://github.com/jyio/geventreactor

รูปแบบปัจจุบันของฉันช่วยให้ผมในการเขียนโปรแกรมในรูปแบบการเขียนโปรแกรมที่ดีของ Gevent และสิ่งที่ใช้ประโยชน์เช่นไม่ปิดกั้นsocket, urllib2และอื่น ๆ ที่โมดูล ฉันสามารถใช้รหัส Python ปกติสำหรับทำสิ่งต่าง ๆ ซึ่งตรงข้ามกับเส้นโค้งการเรียนรู้และความไม่สะดวกในการทำสิ่งพื้นฐานที่บิดเบี้ยวได้ง่าย ฉันยังสามารถใช้ห้องสมุดบุคคลที่สามส่วนใหญ่ที่ปกติไม่ต้องสงสัยกับ Twisted หรือต้องการการใช้เธรด

ฉันยังสามารถหลีกเลี่ยงการตั้งโปรแกรมการโทรกลับที่ซับซ้อนและใช้งานยากเกินไปได้อย่างสมบูรณ์โดยใช้ Greenlets (แทนที่จะDeferredเป็น s และ callbacks และ / หรือ@inlineCallbacks)

(คำตอบนี้ถูกเขียนขึ้นจากประสบการณ์ส่วนตัวของฉันที่ใช้ทั้ง Twisted และ Gevent ในโครงการชีวิตจริงโดยมีประสบการณ์มากขึ้นในการใช้ Twisted (แต่ฉันไม่ได้อ้างว่าเป็นผู้เชี่ยวชาญ Twisted) ซอฟต์แวร์ที่ฉันต้องเขียนไม่ได้ ไม่ต้องใช้คุณสมบัติของ Twisted มากเกินไปดังนั้นขึ้นอยู่กับชุดของคุณสมบัติที่คุณต้องการของ Twisted ความซับซ้อนพิเศษ (ค่อนข้างไม่เจ็บปวด) ของการผสม Gevent และ Twisted อาจไม่คุ้มค่ากับปัญหา)

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