Khi nào nên sử dụng Tornado, khi nào nên sử dụng Twisted / Cyclone / GEvent / khác [đã đóng]


181

Những khung / thư viện nào trong số này sẽ là lựa chọn tốt nhất để xây dựng ứng dụng web nhiều người dùng hiện đại? Tôi rất thích có một máy chủ web không đồng bộ cho phép tôi mở rộng quy mô một cách dễ dàng. Giải pháp nào sẽ mang lại hiệu suất / khả năng mở rộng / khung hữu ích nhất (về mặt dễ sử dụng và dễ phát triển)?

Sẽ thật tuyệt nếu nó sẽ cung cấp chức năng tốt (websockets, rpc, streaming, v.v.).

Những ưu và nhược điểm của từng giải pháp là gì?


Có cần phải là một trong những khuôn khổ này? Bạn dự định làm gì và có thể một cái gì đó như Django, Pylons, v.v ... hoạt động không?
Joe Doherty

Không, không phải là không, nhưng tôi rất thích nếu nó không đồng bộ và sẽ hỗ trợ tốt cho websockets - tôi cũng đã cập nhật câu hỏi. Cảm ơn bạn.
Wojciech Danilo

3
Một loại câu hỏi rộng, phải không?
Jean-Paul Calderone

Sự lựa chọn của bạn phụ thuộc vào các thư viện mà bạn muốn sử dụng. Thư viện của bạn - về nhiệm vụ, mà bạn muốn giải quyết.
Nikolay Fominyh

1
Vâng, nó rộng, nhưng maybes olvable. Tôi tự hỏi nếu các thư viện này được sử dụng trong sản xuất và ai đó, những người đang sử dụng một số trong số họ hàng ngày có thể cho biết họ tuyệt vời vì cái gì, họ thiếu gì không. Điều gì nên là cơ sở để chọn một thư viện - có lẽ Twisted nên là thất vọng khi nói về Autobahn hay Cyclone? Hoặc mmaybe Autobahn và Cyclone chưa sẵn sàng sản xuất và sự bảo trì của nó đang bị nghi ngờ? Hoặc có lẽ Tornado có thiết kế hiện đại hơn và tương lai có lẽ sẽ tỏa sáng và tuyệt vời và nó nên là lựa chọn cho dự án khởi nghiệp?
Danojech Danilo

Câu trả lời:


225

" Django là một khung Web Python cấp cao, khuyến khích phát triển nhanh chóng và thiết kế thực dụng, sạch sẽ" . Nếu bạn đang xây dựng một cái gì đó tương tự như một trang web thương mại điện tử, thì có lẽ bạn nên đi với Django. Nó sẽ hoàn thành công việc của bạn nhanh chóng. Bạn không phải lo lắng về quá nhiều sự lựa chọn công nghệ. Nó cung cấp mọi thứ bạn cần từ công cụ mẫu đến ORM. Sẽ có một chút ý kiến ​​về cách bạn cấu trúc ứng dụng của mình, điều này tốt nếu bạn hỏi tôi. Và nó có cộng đồng mạnh nhất của tất cả các thư viện khác, có nghĩa là có sẵn trợ giúp dễ dàng.

" Flask là một microframework cho Python dựa trên Werkzeug, Jinja 2 và ý định tốt" . Coi chừng - "microframework" có thể gây hiểu nhầm. Điều này không có nghĩa là Flask là một thư viện nửa nướng. Điều này có nghĩa là lõi của bình rất, rất đơn giản. Không giống như Django, Nó sẽ không đưa ra bất kỳ quyết định Công nghệ nào cho bạn. Bạn có thể tự do chọn bất kỳ công cụ mẫu hoặc ORM nào làm bạn hài lòng. Mặc dù nó đi kèm với công cụ mẫu Jinja theo mặc định, bạn luôn được tự do lựa chọn của chúng tôi. Theo như tôi biết thì Flask có ích để viết các điểm cuối API (dịch vụ RESTful).

" Twisted là một công cụ mạng hướng sự kiện được viết bằng python" . Đây là một động cơ hiệu suất cao. Lý do chính cho tốc độ của nó là một cái gì đó được gọi là hoãn lại. Twisted được xây dựng trên đầu của trì hoãn. Đối với những người bạn không biết về defered, đó là cơ chế thông qua kiến ​​trúc không đồng bộ đạt được. Xoắn rất nhanh. Nhưng không phù hợp để viết webapps thông thường. Nếu bạn muốn làm một cái gì đó mạng cấp thấp, xoắn là bạn của bạn.

" Tornado là một khung web Python và thư viện mạng không đồng bộ, ban đầu được phát triển tại FriendFeed. Bằng cách sử dụng I / O mạng không chặn, Tornado có thể mở rộng tới hàng chục nghìn kết nối mở, lý tưởng cho việc bỏ phiếu dài, WebSockets và các ứng dụng khác yêu cầu kết nối lâu dài với mỗi người dùng ". Tornado đứng một số nơi giữa Django và Flask. Nếu bạn muốn viết một cái gì đó với Django hoặc Flask, nhưng nếu bạn cần một hiệu suất tốt hơn, bạn có thể chọn Tornado. nó có thể xử lý vấn đề C10k rất tốt nếu nó được kiến ​​trúc đúng.

" Lốc xoáy là một khung máy chủ web dành cho Python thực hiện API Tornado dưới dạng giao thức Twisted" . Bây giờ, nếu bạn muốn một cái gì đó gần như hiệu suất như Twisted nhưng dễ viết các ứng dụng web thông thường thì sao? Nói xin chào với lốc xoáy. Tôi thích Cyclone hơn Tornado. Nó có một API rất giống với Tornado. Thực tế, đây là một nhánh của Tornado. Nhưng vấn đề là nó có cộng đồng nhỏ tương đối. Alexandre Fiori là người đi lại chính duy nhất cho repo.

" Kim tự tháp là một khung phát triển ứng dụng web Python chung, mã nguồn mở. Mục tiêu chính của nó là giúp nhà phát triển Python tạo các ứng dụng web dễ dàng hơn." Tôi chưa thực sự sử dụng Kim tự tháp, nhưng tôi đã xem qua tài liệu. Theo những gì tôi hiểu, Kim tự tháp rất giống với Flask và tôi nghĩ bạn có thể sử dụng Kim tự tháp ở bất cứ nơi nào Flask có vẻ phù hợp và ngược lại.

BIÊN TẬP : Yêu cầu xem xét bất kỳ khuôn khổ nào khác được hoan nghênh!

Nguồn: http://dhilipsiva.com/2013/05/19/python-lologists-django-twisted-tornado-flask-cyclone-and-pyramid.html


1
Django là khuôn khổ ưa thích của tôi. Tài liệu của nó rất tốt và ORM rất dễ dàng. Nam là tuyệt vời cho việc di chuyển lược đồ cơ sở dữ liệu .... Nhưng câu hỏi chứa đựng điều này: "Tôi rất thích có một máy chủ web không đồng bộ sẽ cho phép tôi mở rộng quy mô một cách dễ dàng." Django được tạo cho các trang web yêu cầu + phản hồi cổ điển, không phải cho async.
guettli

1
Bạn có thể viết về Kim tự tháp?
Fizer Khan

5
@FizerKhan: Theo yêu cầu của bạn, tôi đã cập nhật câu trả lời. Xin lỗi nó mất quá nhiều thời gian. Không có thời gian để sử dụng Kim tự tháp. Nhưng tôi đã đi qua các tài liệu.
dhilipsiva

1
Tôi muốn nói thêm rằng môi trường đơn luồng mà Tornado sử dụng dễ bị lỗi hơn nhiều - một lỗi khiến mã cho một điểm cuối API đơn chậm hơn sẽ dễ gây ra sự cố cho tất cả các điểm cuối.
Abel Molina

1
Bạn có thể bình luận về cherrypy?
Stavros Avramidis

60

Đây rõ ràng là một câu trả lời hơi thiên vị , nhưng đó không giống như một câu trả lời sai ; bạn nên luôn luôn sử dụng Twisted. Tôi đã trả lời các câu hỏi tương tự trước đây, nhưng vì câu hỏi của bạn không hoàn toàn giống nhau, đây là một số lý do:

"Hiệu suất tốt nhất"

Twisted liên tục theo dõi hiệu suất của chúng tôi tại trang web speed.twistedmatrix.com . Chúng tôi cũng là một trong những dự án đầu tiên được theo dõi bởi trang tương tự của PyPy , qua đó đảm bảo hiệu suất tốt của Twisted trong thời gian chạy mà bất kỳ ai quan tâm đến các ứng dụng hiệu suất cao trong Python.

"Khả năng mở rộng"

Theo hiểu biết của tôi, không có khung nào được liệt kê có bất kỳ hỗ trợ tích hợp nào để tự động mở rộng; tất cả chúng đều là các khung giao tiếp, vì vậy bạn phải thực hiện công việc để giao tiếp giữa các nút chia tỷ lệ của mình. Tuy nhiên, Twisted có một lợi thế trong hỗ trợ tích hợp cho đa xử lý cục bộ . Công bằng mà nói, có một tiện ích bổ sung của bên thứ ba cho Tornado cho phép bạn làm điều tương tự. Trong các bản phát hành gần đây, Twisted đã thêm các tính năng làm tăng số cách bạn có thể chia sẻ công việc giữa các lõi và công việc đang diễn ra trong khu vực đó. Twisted cũng có một vài giao thức RPC tích hợp , "bản địa" , cung cấp một bộ công cụ xây dựng cho bất kỳ thành ngữ tỷ lệ nào bạn muốn theo đuổi.

"Hữu dụng nhất"

Rất nhiều người dường như thấy Twisted rất hữu ích . Nhiều đến mức nhiều người trong số họ đã mở rộng nó và cung cấp các tiện ích mở rộng của họ cho bạn.

"Chức năng"

Ra khỏi hộp, Twisted bao gồm:

Trong bộ phận cuối cùng này, ít nhất, Twisted dường như là một người chiến thắng rõ ràng cho chức năng tích hợp. Và tất cả điều này, trong một gói chỉ hơn 2 megabyte!


6
Tại sao nhiều người nói rằng họ không còn sử dụng Twisted, mà là GEvent?
remdezx

1
Có rất nhiều người nói rằng thật khó để duy trì các ứng dụng lớn khi sử dụng Twisted (vì kiến ​​trúc gọi lại của nó): stackoverflow.com/questions/3048012/. Sẽ không tốt hơn nếu sử dụng Twisted dựa trên gevent hay gevent?
Wojciech Danilo

8
@remdezx Theo câu hỏi của bạn, có hai lý do. Một là mọi người thấy Twisted khó hiểu vì lập trình đồng thời là khó hiểu. Sau đó, họ chuyển sang GEvent vì nó rất dễ hiểu - miễn là không có sự tương tranh, mọi thứ đều hoạt động như bạn mong đợi. Một lý do khác là việc chuyển mã sang GEvent không được viết bằng API theo hướng sự kiện để có được lợi ích hiệu năng của I / O theo hướng sự kiện. Nếu mã của bạn không chia sẻ quá nhiều trạng thái, một cổng như vậy có thể hoạt động tốt.
Glyph

1
@Glyph, bạn đang nói về đồng thời, nhưng ... không phải đồng thời hỗ trợ Gevent hay Twisted (tất nhiên bạn có thể sử dụng đa xử lý với gevent và sử dụng một nhóm các luồng thực và nhóm xanh trên mỗi luồng - hoạt động tốt với tôi và bạn có thể sử dụng plugin Twisted để thực hiện chính xác như nhau - chạy nhiều mục đích xoắn bên cạnh nhau). Nhưng liệu Twisted gices cho bạn một cái gì đó nhiều hơn gevent? Tôi nghĩ ngay cả với nhiều trường hợp của gevent / twist, gevent vẫn dễ dàng thực hiện hơn mà không cần các cuộc gọi lại io rõ ràng của nó. Tui bỏ lỡ điều gì vậy?
Wojciech Danilo

2
@ danilo2 Vâng, bạn đang thiếu ít nhất một điều :). Cụ thể, bạn đang hiểu nhầm từ "đồng thời" có nghĩa là "thực thi song song đồng thời trên nhiều CPU". Twisted có thể thực hiện lập lịch I / O đồng thời thông qua I / O không đồng bộ (dựa trên cuộc gọi lại). GEvent có thể thực hiện lập lịch I / O đồng thời thông qua bộ lập lịch vi xử lý. Trong Twisted, sử dụng spawnProcess, lập lịch I / O này cũng có thể được dịch thành lập lịch CPU.
Glyph

48

Tôi thích phản hồi @Glyph. Twisted là rất toàn diện, khung trăn phong phú. Twisted và Tornado có thiết kế rất giống nhau. Và tôi rất thích thiết kế này:

  • nó nhanh
  • dễ hiểu
  • dễ dàng mở rộng
  • không yêu cầu mở rộng c
  • hoạt động trên PyPy.

Nhưng tôi muốn làm nổi bật Tornado , thứ tôi thích và gần đây đã trở nên phổ biến. Tornado, giống như Twisted, sử dụng lập trình kiểu gọi lại, nhưng nó có thể được nội tuyến bằng cách sử dụng tornado.gen.engine( twisted.internet.inlineCallbackstrong Twisted).

Cơ sở mã hóa

Nhận xét tốt nhất là từ trang web http://cyclone.io . lốc xoáy cố gắng trộn Twisted và Tornado vì:

Twisted là một trong những thư viện trưởng thành nhất để I / O không chặn có sẵn cho công chúng. Tornado là phiên bản mã nguồn mở của máy chủ web FriendFeed, một trong những máy chủ web phổ biến và nhanh nhất dành cho Python, với API rất tốt để xây dựng các ứng dụng web.

Ý tưởng là kết nối API thanh lịch và đơn giản của Tornado với Vòng lặp sự kiện của Twisted, cho phép một số lượng lớn các giao thức được hỗ trợ.

Nhưng năm 2011 tornado.platform.twisted đã mang lại chức năng tương tự.

Hiệu suất

Tornado có hiệu suất tốt hơn nhiều . Nó cũng hoạt động trơn tru với PyPy và thu được lợi nhuận khổng lồ.

Khả năng mở rộng

Giống như Twisted. Lốc xoáy cótornado.process và rất nhiều dịch vụ rpc được triển khai trên nó.

Chức năng

Có 71 gói dựa trên Tornado, so với 148 Twisted và 48 Gevent. Nhưng nếu bạn xem xét kỹ và tính trung bình thời gian tải lên các gói, bạn sẽ thấy rằng Twisted là những cái cũ nhất, sau đó là Gevent và Tornado mới nhất. Hơn nữa, có tornado.platform.twistedmô-đun cho phép bạn chạy mã được viết cho Twisted trên Tornado .

Tóm lược

Với Tornado, bạn có thể sử dụng mã từ Twisted. Không cần sử dụng lốc xoáy mà chỉ xoắn mã của bạn (mã của bạn trở nên lộn xộn hơn).

Đối với năm 2014, Tornado được coi là khung async mặc định được chấp nhận rộng rãi và hoạt động cả trên python2 và python3. Ngoài ra phiên bản mới nhất 4.x mang đến rất nhiều chức năng từ https://docs.python.org/dev/l Library / asyncio.html .

Tôi đã viết một bài báo, giải thích lý do tại sao tôi xem xét Tornado - khung web Python tốt nhất nơi tôi đã viết nhiều hơn về chức năng Tornado.


15

( CẬP NHẬT : Tôi rất ngạc nhiên về số ít câu trả lời ở đây đề xuất hoặc thậm chí đề cập đến Gevent, tôi không nghĩ nó tương xứng với mức độ phổ biến, hiệu suất và dễ sử dụng của thư viện tuyệt vời này!)

Gevent và Twisted không loại trừ lẫn nhau, mặc dù điều ngược lại có vẻ rõ ràng lúc đầu. Có một dự án được gọi là geventreactorcho phép một người tương đối thuận lợi tận dụng tốt nhất cả hai thế giới, đó là:

  • Mô hình luồng hiệu quả và giá rẻ (hợp tác xanh) của Gevent, dễ lập trình hơn khi nói đến đồng thời, thẳng thắn, Twisted inlineCallbackschỉ đơn giản là không phù hợp với hiệu suất khi nói đến nhiều coroutine, và không phải trong điều khoản dễ dàng / minh bạch của việc sử dụng: yieldDeferredsở mọi nơi; thường khó xây dựng một số trừu tượng; dấu vết ngăn xếp vô dụng khủng khiếp với cả Deferreds trần cũng như, và thậm chí nhiều hơn với @inlineCallbacks.
  • Tất cả các chức năng tích hợp của Twisted bạn có thể mơ ước, bao gồm nhưng không giới hạn IReactorProcess.spawnProcess.

Cá nhân tôi hiện đang sử dụng Gevent 1.0rc2 với Twisted 12.3 được bắc cầu geventreactor. Tôi đã triển khai các bổ sung và cải tiến chưa được công bố của riêng mình geventreactormà tôi sẽ sớm xuất bản, hy vọng là một phần của geventreactorkho GitHub ban đầu: https://github.com/jyio/geventreactor .

Bố trí hiện tại của tôi cho phép tôi để chương trình trong mô hình lập trình tốt đẹp của Gevent, và những thứ đòn bẩy như một non-blocking socket, urllib2và các mô-đun. Tôi có thể sử dụng mã Python thông thường để làm những việc thông thường, trái ngược với đường cong học tập và sự bất tiện khi thực hiện ngay cả những điều cơ bản, đơn giản theo cách Twisted. Tôi cũng có thể dễ dàng sử dụng hầu hết các thư viện của bên thứ 3 thường không có vấn đề với Twisted hoặc yêu cầu sử dụng các luồng.

Tôi cũng có thể tránh hoàn toàn việc lập trình dựa trên cuộc gọi lại lúng túng và thường quá phức tạp bằng cách sử dụng greenlets (thay vì Deferreds và gọi lại, và / hoặc @inlineCallbacks).

(Câu trả lời này được viết dựa trên kinh nghiệm cá nhân của tôi khi sử dụng cả Twisted và Gevent trong các dự án thực tế, với nhiều kinh nghiệm hơn khi sử dụng Twisted (nhưng tôi không tự nhận là chuyên gia Twisted). Phần mềm tôi phải viết Không phải sử dụng quá nhiều tính năng của Twisted, do đó tùy thuộc vào bộ tính năng bạn yêu cầu của Twisted, sự phức tạp thêm (tương đối không gây đau đớn) của việc trộn Gevent và Twisted có thể không gây rắc rối.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.