복붙노트

[PYTHON] Python에서 Comet을 이해하는 데 도움이 필요하다 (Django 사용)

PYTHON

Python에서 Comet을 이해하는 데 도움이 필요하다 (Django 사용)

이것에 대해 2 일을 보내고 난 후에도 Python의 Comet에 대한 모든 선택과 구성을 이해하는 것은 불가능하다는 것을 알게됩니다. 내가 찾은 모든 블로그 게시물뿐만 아니라 여기에서 모든 대답을 읽었습니다. 이 시점에서 내가 출혈하려고하는 것 같아서,이 질문에 잘못된 점에 대해 사과드립니다.

나는이 모든 것에 완전히 새로운 것입니다. 이전에 아파치에서 PHP / Django 백엔드가있는 간단한 비 실시간 사이트였습니다.

내 목표는 실시간 채팅 응용 프로그램을 만드는 것입니다. 사용자, 인증, 템플릿 등을 위해 Django에 묶여 있기를 바랍니다.

도구에 대해 읽을 때마다 도구 위에 다른 도구가 필요하다고 말하면서 끝이없는 체인처럼 느껴집니다.

우선,이 작업에 필요한 모든 도구를 누구나 분류 할 수 있습니까? 나는 다른 서버, 네트워킹 라이브러리, 엔진, 자바 스크립트에 대해 클라이언트 측에서 읽었으며 그 밖의 다른 것들은 모른다. 나는 그것이이 복합체 일 것이라고 결코 상상조차하지 않았다.

Twisted / Twisted Web이 인기가있는 것 같지만, 내가 필요로하는 것을 통합 할 생각이 없다. 적어도 클라이언트 측 JS가 필요하다는 것을 추측한다.

내가 제대로 이해하면, 궤도에 따라 Twisted가 만들어졌고, 다른 것들이 필요합니까?

Gevent와 Eventlet은 Twisted와 동일한 범주입니까? 내가 그걸로 얼마나 더 필요합니까?

Celery, RabbitMQ, KV 등의 레디 스 (Redis) 매장은 어디로 들어 옵니까? 메시지 큐 개념을 이해하지 못합니다. 필수적이며 어떤 서비스를 제공합니까?

내가 살펴 봐야 할 완전한 채팅 앱 자습서가 있습니까?

나는이 정신 장애물을 지나쳐 나를 도와주는 사람에게 전적으로 빚을지게 될 것이며, 무엇이든 남겨두면 주저하지 말고 물어보십시오. 나는 그것이 꽤로드 된 질문이라는 것을 압니다.

해결법

  1. ==============================

    1.Socket.IO를 사용할 수 있습니다. 그것을위한 도대체 및 토네이도 핸들러가 있습니다. 장고와 함께 gevent-socketio에 대한 내 블로그 게시물을 참조하십시오 : http://codysoyland.com/2011/feb/6/evented-django-part-one-socketio-and-gevent/

    Socket.IO를 사용할 수 있습니다. 그것을위한 도대체 및 토네이도 핸들러가 있습니다. 장고와 함께 gevent-socketio에 대한 내 블로그 게시물을 참조하십시오 : http://codysoyland.com/2011/feb/6/evented-django-part-one-socketio-and-gevent/

  2. ==============================

    2.나는 지난 몇 달 동안 같은 연구를해야만하는 고통을 느낍니다. 아직 적절한 문서를 처리 할 시간이 없지만 http://bitbucket.org/virtualcommons/vcweb에서 socket.io 및 tornadio를 사용하여 Django를 사용하는 예가 있습니다. - 직접 통신을 설정하고 Django 서버 측에서 대기열을 사용하는 tornadio 서버 프로세스 (즉, django 뷰의 논리는 대기열에 메시지를 푸시합니다. tornadio가 처리하면 메시지의 json 인코딩 버전이 모든 관심있는 구독자에게 푸시됩니다.) 그 부분을 완전히 구현했습니다. 내가 설정 한 방법은 다음과 같습니다.

    나는 지난 몇 달 동안 같은 연구를해야만하는 고통을 느낍니다. 아직 적절한 문서를 처리 할 시간이 없지만 http://bitbucket.org/virtualcommons/vcweb에서 socket.io 및 tornadio를 사용하여 Django를 사용하는 예가 있습니다. - 직접 통신을 설정하고 Django 서버 측에서 대기열을 사용하는 tornadio 서버 프로세스 (즉, django 뷰의 논리는 대기열에 메시지를 푸시합니다. tornadio가 처리하면 메시지의 json 인코딩 버전이 모든 관심있는 구독자에게 푸시됩니다.) 그 부분을 완전히 구현했습니다. 내가 설정 한 방법은 다음과 같습니다.

    나는 그것이 깔끔한 자바 스크립트 + 파이썬 코드를 허용하는 것으로 보인 것처럼 궤도를 따라 돌고, 후크 박스와 gevent를 보았지만 socket.io + 토네이도로 가기로 결정했다. 지난 해 Python / Django를 배우기 시작한 것은 잘못되었습니다.

  3. ==============================

    3.Redis는 원시 게시 / 구독을 지원하는 지속성 계층과 관련이 있습니다. 따라서 db를 폴링하여 새 메시지를 찾는 상황 대신 채널을 구독하고 메시지를 사용자에게 푸시 할 수 있습니다.

    Redis는 원시 게시 / 구독을 지원하는 지속성 계층과 관련이 있습니다. 따라서 db를 폴링하여 새 메시지를 찾는 상황 대신 채널을 구독하고 메시지를 사용자에게 푸시 할 수 있습니다.

    당신이 묘사하는 시스템 유형의 실제 예를 발견했습니다. 마법은 socketio보기에서 발생합니다.

    def socketio(request):
        """The socket.io view."""
        io = request.environ['socketio']
        redis_sub = redis_client().pubsub()
        user = username(request.user)
    
        # Subscribe to incoming pubsub messages from redis.
        def subscriber(io):
            redis_sub.subscribe(room_channel())
            redis_client().publish(room_channel(), user + ' connected.')
            while io.connected():
                for message in redis_sub.listen():
                    if message['type'] == 'message':
                        io.send(message['data'])
        greenlet = Greenlet.spawn(subscriber, io)
    
        # Listen to incoming messages from client.
        while io.connected():
            message = io.recv()
            if message:
                redis_client().publish(room_channel(), user + ': ' + message[0])
    
        # Disconnected. Publish disconnect message and kill subscriber greenlet.
        redis_client().publish(room_channel(), user + ' disconnected')
        greenlet.throw(Greenlet.GreenletExit)
    
        return HttpResponse()
    

    단계별로 단계별보기 :

    Redis Cookbook은 Redis 측면에 대해 더 자세히 설명하고 메시지를 유지할 수있는 방법을 논의합니다.

    Twisted는 이벤트 기반 네트워킹 라이브러리이며,이 애플리케이션에서 Gevent의 대안으로 간주 될 수 있습니다. 내 경험으로는 디버깅하기가 강력하고 어렵습니다.

    Celery는 "분산 된 작업 대기열"입니다. 기본적으로 여러 작업 단위를 여러 시스템에 분산시킬 수 있습니다. "분산 된"각도는 기계 사이에 어떤 종류의 수송이 필요하다는 것을 의미합니다. 샐러리는 RabbitMQ (및 Redis도 포함하여)의 여러 유형의 운송을 지원합니다.

    예제의 맥락에서, Celery는 욕설 같은 내용을 스캔하는 것과 같이 각 메시지에서 일종의 값 비싼 처리를 수행해야하는 경우에만 적합합니다. 여전히 셀러리 태스크를 초기화해야하는 경우도 있으므로 socket.io 콜백을 수신하는 코드가 필요합니다.

    (당신이 완전히 혼란스럽지 않았던 경우를 대비하여 셀러리 자체는 Gevent를 기본 동시성 라이브러리로 사용할 수 있습니다.)

    희망이 도움이됩니다!

  4. from https://stackoverflow.com/questions/5614274/need-help-understanding-comet-in-python-with-django by cc-by-sa and MIT license