Tornado 사용시기, Twisted / Cyclone / GEvent / 기타 사용시기 [폐쇄]


181

현대의 멀티 유저 웹 애플리케이션을 구축하기에 가장 적합한 프레임 워크 / 라이브러리는 무엇입니까? 비동기식 웹 서버를 사용하여 쉽게 확장 할 수 있습니다. 어떤 솔루션이 최상의 성능 / 확장 성 / 가장 유용한 프레임 워크를 제공 합니까 (사용하기 쉽고 개발하기 쉬운 측면에서)?

좋은 기능 (웹 소켓, rpc, 스트리밍 등) 을 제공한다면 좋을 것 입니다.

각 솔루션의 장단점은 무엇입니까?


이러한 프레임 워크 중 하나 여야합니까? Django, Pylons 등과 같은 작업을 수행하려는 계획은 무엇입니까?
Joe Doherty

아니요, 그렇지는 않지만 비동기식이며 웹 소켓을 잘 지원한다면 좋을 것입니다. 질문도 업데이트했습니다. 감사합니다.
Wojciech Danilo

3
광범위한 질문입니까?
Jean-Paul Calderone

선택은 사용하려는 라이브러리에 따라 다릅니다. 라이브러리-당신이 해결하고자하는 작업.
Nikolay Fominyh 2014

1
네, 그것은 넓지 만 어쩌면 사랑 스럽습니다. 이 라이브러리가 프로덕션 환경에서 사용되는지, 매일 그중 일부를 사용하는 누군가가 자신이 무엇을 좋아하는지, 무엇을 부족했는지 등을 알 수 있는지 궁금합니다. 라이브러리를 선택하기위한 기준은 무엇입니까? 아우토반이나 사이클론에 대해 이야기 할 때 간혹 감가 상각 되었습니까? 아니면 아우토반과 사이클론은 생산 준비가되지 않았으며 유지 보수에 문제가 있습니까? 아니면 토네이도는 더 현대적인 디자인을 가지고 있으며 미래는 아마도 밝고 훌륭 할 것이며 스타트 업 프로젝트의 선택이 될 것입니까?
Wojciech Danilo

답변:


226

" Django 는 빠른 개발과 깨끗하고 실용적인 디자인을 장려하는 고급 Python 웹 프레임 워크입니다 . " 전자 상거래 사이트와 유사한 것을 구축하고 있다면 아마도 장고와 함께 가야 할 것입니다. 작업이 빠르게 완료됩니다. 너무 많은 기술 선택에 대해 걱정할 필요가 없습니다. 템플릿 엔진에서 ORM에 이르기까지 필요한 모든 것을 제공합니다. 앱을 구성하는 방식에 대해 약간의 의견이있을 것입니다. 또한 다른 모든 라이브러리 중에서 가장 강력한 커뮤니티를 보유하고 있으므로 쉽게 도움을받을 수 있습니다.

" Flask 는 Werkzeug, Jinja 2 및 좋은 의도에 기반한 Python의 마이크로 프레임 워크입니다 . " "마이크로 프레임 워크"는 오해의 소지가 있습니다. 이것이 Flask가 반 구운 라이브러리라는 것을 의미하지는 않습니다. 이것은 플라스크의 핵심이 매우 간단하다는 것을 의미합니다. Django와 달리 기술 결정은 없습니다. 원하는 템플릿 엔진 또는 ORM을 자유롭게 선택할 수 있습니다. 기본적으로 Jinja 템플릿 엔진과 함께 제공되지만 항상 자신의 것을 자유롭게 선택할 수 있습니다. 내가 아는 한 Flask는 API 엔드 포인트 (RESTful 서비스)를 작성하는 데 편리합니다.

" Twisted 는 파이썬으로 작성된 이벤트 중심 네트워킹 엔진입니다 . " 고성능 엔진입니다. 속도의 주된 이유는 연기 된 것입니다. 트위스트는 지연된 항목 위에 구축됩니다. 연기에 대해 모르는 사람들에게는 비동기 아키텍처를 통한 메커니즘이 달성됩니다. 트위스트는 매우 빠릅니다. 그러나 기존 웹앱을 작성하는 데는 적합하지 않습니다. 저수준 네트워킹 물건을 원한다면 친구가 뒤틀린 것입니다.

" Tornado 는 원래 FriendFeed에서 개발 한 Python 웹 프레임 워크 및 비동기 네트워킹 라이브러리입니다. 비 차단 네트워크 I / O를 사용하여 Tornado는 수만 개의 개방형 연결로 확장 할 수 있으므로 긴 폴링, WebSocket 및 기타 응용 프로그램에 이상적입니다. 각 사용자에게 오래 지속되어야합니다 " . 토네이도는 장고와 플라스크 사이에 있습니다. Django 또는 Flask로 무언가를 쓰고 싶지만 더 나은 성능이 필요하면 Tornado를 선택할 수 있습니다. 제대로 설계되면 C10k 문제를 매우 잘 처리 할 수 ​​있습니다.

" Cyclone 은 Tornado API를 Twisted 프로토콜로 구현하는 Python 용 웹 서버 프레임 워크입니다 . " 트위스트만큼이나 성능이 뛰어나고 기존 웹앱을 작성하기 쉬운 것을 원한다면 어떻게해야할까요? 사이클론에게 인사하십시오. 나는 토네이도보다 사이클론을 선호합니다. 토네이도와 매우 유사한 API가 있습니다. 사실, 이것은 토네이도의 포크입니다. 그러나 문제는 그것이 상대적으로 작은 공동체라는 것입니다. 알렉산드르 피오리 (Alexandre Fiori)는 레포에 대한 유일한 주요 커미터입니다.

" Pyramid 는 일반적인 오픈 소스 Python 웹 응용 프로그램 개발 프레임 워크입니다. 주요 목표는 Python 개발자가 웹 응용 프로그램을보다 쉽게 ​​만들 수 있도록하는 것입니다." 나는 실제로 피라미드를 사용하지는 않았지만 문서를 살펴 보았습니다. 내가 이해에서 피라미드와 매우 유사하다 플라스크 나는 어디든지 당신이 피라미드를 사용할 수 있다고 생각 플라스크가 적절한 것 같다 그 반대의 경우도 마찬가지입니다.

편집 : 다른 프레임 워크 검토 요청을 환영합니다!

출처 : http://dhilipsiva.com/2013/05/19/python-libraries-django-twisted-tornado-flask-cyclone-and-pyramid.html


1
Django는 내가 선호하는 프레임 워크입니다. 문서는 매우 훌륭하고 ORM은 쉽습니다. South는 데이터베이스 스키마 마이그레이션에 적합합니다 .... 그러나이 질문에는 다음과 같은 내용이 포함되어 있습니다. "저는 쉽게 확장 할 수있는 비동기식 웹 서버를 갖고 싶습니다." Django는 비동기가 아닌 고전적인 요청 + 응답 사이트를 위해 만들어졌습니다.
guettli

1
피라미드에 대해 쓸 수 있습니까?
Fizer Khan

5
@FizerKhan : 귀하의 요청에 따라 답변을 업데이트했습니다. 너무 오래 걸려서 죄송합니다. 피라미드를 사용할 시간이 없었습니다. 그러나 나는 문서를 조사했다.
dhilipsiva

1
Tornado가 사용하는 단일 스레드 환경은 훨씬 버그가 발생하기 쉽습니다. 단일 API 엔드 포인트의 코드를 느리게 만드는 실수는 모든 엔드 포인트에 쉽게 문제를 일으킬 수 있습니다.
Abel Molina

1
체리 피에 대해 언급 해 주시겠습니까?
Stavros Avramidis 2018 년

60

이것은 분명히 다소 편향된 답변이지만 잘못된 답변 과는 다릅니다 . 항상 Twisted를 사용해야합니다. 이전 에 비슷한 질문 에 답변 했지만 귀하의 질문이 동일하지 않기 때문에 몇 가지 이유가 있습니다.

"최고의 성능"

Twisted는 speed.twistedmatrix.com 웹 사이트 에서 지속적으로 성능을 모니터링합니다 . 또한 PyPy의 유사한 사이트 에서 모니터링 하는 첫 번째 프로젝트 중 하나 였으므로 누구나 Python의 고성능 응용 프로그램과 관련된 런타임에서 Twisted의 우수한 성능을 보장했습니다.

"확장 성"

내가 알기로는 나열된 프레임 워크 중 어느 것도 자동 스케일링을 기본적으로 지원하지 않습니다. 그것들은 모두 통신 프레임 워크이므로 스케일링 노드 사이에서 통신하려면 작업을 수행해야합니다. 그러나 Twisted는 로컬 다중 처리를 기본적으로 지원 한다는 이점이 있습니다. 공정 하게도 Tornado 용 타사 애드온 이있어 동일한 작업을 수행 할 수 있습니다. 최근 릴리스에서 Twisted는 코어간에 작업을 공유 할 수있는 방법의 수를 늘리는 기능추가 했으며 해당 영역에서 작업이 진행 중입니다. 트위스트는 몇 가지가 잘 통합 , "네이티브" 당신이 추구 원하는 스케일링 관용구를위한 건설 키트를 제공하는 RPC 프로토콜을.

"가장 유용한"

많은 사람들 이 Twisted가 매우 유용하다고 생각합니다 . 너무 많은 사람들이 그것을 확장하고 확장 기능을 사용할 수 있도록했습니다.

"기능"

Twisted는 기본적으로 다음을 포함합니다.

이 마지막 부서에서 최소한 Twisted는 기본 제공 기능의 확실한 승자로 보입니다. 그리고이 모든 것이 2MB 이상의 패키지로 제공됩니다!


6
왜 그렇게 많은 사람들이 더 이상 Twisted를 사용하지 않고 GEvent를 사용한다고 말합니다.
remdezx

1
그것 (때문에 콜백 아키텍처) 트위스트를 사용하여 큰 응용 프로그램을 유지하기 어렵다고 말하는 사람들이 많다 : stackoverflow.com/questions/3048012/... 겠습니까 그것은 트위스트 기반으로 사용 gevent 또는 gevent에 더 좋지?
Wojciech Danilo

8
@remdezx 귀하의 질문에 관해서는 두 가지 이유가 있습니다. 하나는 동시 프로그래밍이 이해하기 어렵 기 때문에 사람들이 Twisted를 이해하기 어렵다는 것입니다. 그런 다음 피상적으로 이해하기 쉽기 때문에 GEvent로 전환합니다. 동시성이 없으면 모든 것이 예상대로 작동합니다. 또 다른 이유는 이벤트 중심의 I / O의 성능 이점을 얻기 위해 이벤트 중심 API를 사용하여 작성되지 않은 GEvent로 코드를 포팅하는 작업이 훨씬 적기 때문입니다. 코드가 너무 많은 상태를 공유하지 않으면 그러한 포트가 정상적으로 작동합니다.
글리프

1
@Glyph, 동시성에 대해 이야기하고 있지만 ... Gevent 또는 Twisted는 동시성을 지원하지 않습니다 (물론 gevent로 다중 처리를 사용할 수 있고 각 스레드에서 실제 스레드 풀과 그린 릿 풀을 사용할 수 있음-나에게 잘 작동합니다. Twisted 플러그인을 사용하여 정확히 똑같이 할 수 있습니다-서로 옆에 여러 꼬인 인 텐트를 실행하십시오). 그러나 Twisted는 gevent보다 더 많은 것을 제공합니까? gevent / twisted의 여러 인스턴스가 있어도 gevent는 명시 적 io 콜백없이 이해하기가 더 쉽다고 생각합니다. 뭔가 빠졌습니까?
Wojciech Danilo

2
@ danilo2 네, 적어도 한가지 빠졌습니다 :). 특히 "동시성"이라는 단어를 "여러 CPU에서 동시 병렬 실행"을 의미하는 것으로 오해하고 있습니다. 트위스트는 비동기 (콜백 기반) I / O를 통해 동시 I / O 스케줄링을 수행 할 수 있습니다. GEvent는 마이크로 스레드 스케줄러를 통해 동시 I / O 스케줄링을 수행 할 수 있습니다. Twisted에서을 사용 spawnProcess하여이 I / O 스케줄링을 CPU 스케줄링으로 변환 할 수도 있습니다.
글리프

48

@Glyph 응답이 마음에 듭니다. Twisted는 매우 포괄적이고 풍부한 파이썬 프레임 워크입니다. 트위스트와 토네이도는 매우 비슷한 디자인입니다. 그리고 나는이 디자인을 매우 좋아합니다.

  • 빠르다
  • 이해하기 쉬운
  • 확장하기 쉬운
  • C 확장이 필요하지 않습니다
  • PyPy에서 작동합니다.

그러나 나는 토네이도 를 강조하고 싶습니다 . Twisted와 마찬가지로 Tornado는 콜백 스타일 프로그래밍을 사용하지만 tornado.gen.engine( twisted.internet.inlineCallbacksTwisted에서)를 사용하여 인라인 할 수 있습니다 .

코드베이스

가장 좋은 의견은 http://cyclone.io 사이트입니다. cyclone은 다음 과 같은 이유로 Twisted와 Tornado를 혼합하려고 시도합니다.

Twisted는 일반인이 이용할 수있는 비 차단 I / O를위한 가장 성숙한 라이브러리 중 하나입니다. 토네이도는 웹 애플리케이션 구축을위한 매우 적절한 API를 갖춘 가장 인기 있고 빠른 Python 웹 서버 중 하나 인 FriendFeed 웹 서버의 오픈 소스 버전입니다.

아이디어는 토네이도의 우아하고 간단한 API를 Twisted의 Event-Loop에 연결하여 수많은 지원 프로토콜을 가능하게하는 것입니다.

그러나 2011 년 tornado.platform.twisted에 비슷한 기능을 제공합니다.

공연

토네이도는 훨씬 더 나은 성능을 가지고 있습니다. 또한 PyPy와 완벽하게 작동하며 큰 이익을 얻습니다.

확장 성

꼬인 것과 같습니다. 토네이도에는 tornado.process많은 rpc 서비스가 구현되어 있습니다.

기능성

148 개의 Twisted와 48 개의 Gevent에 비해 71 개의 Tornado 기반 패키지가 있습니다. 그러나 신중하게 살펴보고 패키지 업로드 시간의 중앙값을 계산하면 꼬인 패키지가 가장 오래된 것, Gevent 및 Tornado가 가장 신선한 것을 볼 수 있습니다. 또한 Tornado에서 Twisted 용으로 작성된 코드tornado.platform.twisted실행할 수있는 모듈이 있습니다 .

요약

Tornado를 사용하면 Twisted의 코드를 사용할 수 있습니다. 코드를 왜곡 시키는 사이클론을 사용할 필요가 없습니다 (코드가 더 복잡해집니다).

2014 년 토네이도는 python2와 python3 모두에서 작동하는 널리 사용되는 기본 비동기 프레임 워크로 간주됩니다. 또한 최신 버전 4.x는 https://docs.python.org/dev/library/asyncio.html 에서 많은 기능을 제공합니다 .

Tornado- Tornado 기능에 대해 더 많이 쓴 최고의 Python 웹 프레임 워크 인 Tornado를 고려한 이유를 설명하는 기사를 작성했습니다 .


15

( 업데이트 : Gevent가 권장하거나 언급하지 않는 답변에 대해 슬프게도 놀랐습니다.이 우수한 라이브러리의 인기, 성능 및 사용 편의성에 비례한다고 생각하지 않습니다!)

Gevent와 Twisted는 처음에는 그 반대가 명백해 보일지라도 상호 배타적이지 않습니다. geventreactor두 세계의 장점을 비교적 원활하게 활용할 수 있는 프로젝트 가 있습니다.

  • Gevent의 효율적이고 저렴한 (협조적 녹색) 스레드 모델로서 동시성에 대해 프로그래밍하기가 훨씬 쉽습니다. 솔직히 말해서, Twisted inlineCallbacks는 많은 코 루틴과 관련하여 성능 측면에서 그다지 중요하지 않습니다. 사용의 용이성 / 투명성의 관점 yieldDeferreds사방; 종종 추상화를하기가 어렵다. 맨손 Deferred으로뿐만 아니라 더 끔찍한 쓸모없는 스택 추적 @inlineCallbacks.
  • Twisted의 모든 내장 기능은를 포함하여 (이에 국한되지는 않음) 꿈꿔 왔던 것입니다 IReactorProcess.spawnProcess.

저는 개인적으로에 의해 꼬인 12.3과 함께 Gevent 1.0rc2를 사용하고 geventreactor있습니다. 나는 아직 독자적으로 게시되지 않은 추가 및 개선 사항을 구현하여 원래 GitHub 저장소의 geventreactor일부로 곧 게시 할 예정 geventreactor입니다 : https://github.com/jyio/geventreactor .

내 현재의 레이아웃은 이러한 비 블로킹으로 좋은 Gevent의 프로그래밍 모델 및 활용하는 일에 프로그램에 나를 수 socket, urllib2및 기타 모듈. 학습 곡선과는 달리 단순하고 기본적인 일을 꼬이는 방식과는 달리 규칙적인 일을하기 위해 일반적인 파이썬 코드를 사용할 수 있습니다. 또한 일반적으로 Twisted에서 문제가 있거나 스레드를 사용해야하는 대부분의 타사 라이브러리를 쉽게 사용할 수 있습니다.

또한 그린 렛을 사용하여 ( Deferreds 및 콜백 대신 및 / 또는 @inlineCallbacks) 어색하고 종종 지나치게 복잡한 콜백 기반 프로그래밍을 완전히 피할 수 있습니다 .

(이 답변은 실제 프로젝트에서 Twisted와 Gevent를 모두 사용한 개인적인 경험을 바탕으로 작성되었으며 Twisted를 사용한 경험이 훨씬 많았습니다 (그러나 Twisted 전문가라고 주장하지는 않습니다). 'Twisted'의 기능을 너무 많이 사용할 필요가 없었으므로 Twisted에 필요한 기능 세트에 따라 Gevent와 Twisted를 혼합하는 (상대적으로 고통스럽지 않은) 추가 복잡성이 문제가되지 않을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.