Python 네트워크 프로 그래 밍 의 ZeroMQ 지식 총화

1.ZeroMQ 개술
  •  ZeroMQ(일명 Ø MQ,MQ,또는 zmq)는 끼 워 넣 을 수 있 는 네트워크 라 이브 러 리 같 지만 그 역할 은 병발 프레임 워 크 와 같다.
  • ZeroMQ 는 표준 Berkeley 소켓 과 유사 하 며 프로 세 스 내,프로 세 스 간,TCP 와 멀티캐스트 에서 원자 메 시 지 를 전송 하 는 소켓
  • 과 같은 다양한 전송 도 구 를 제공 합 니 다.
  • 은 각종 모델 을 사용 하여 N 대 N 의 소켓 연결 을 실현 할 수 있 습 니 다.이런 모델 은 발표-구독,작업 배정,요청-응답 을 포함 합 니 다.
  • ZeroMQ 의 속도 가 충분히 빠 르 기 때문에 클 러 스 터 제품 의 구 조 를 충당 할 수 있다.
  • ZeroMQ 의 비동기 I/O 모델 은 확장 가능 한 다 중 핵 응용 프로그램 을 제공 하고 비동기 메시지 로 작업 을 처리 합 니 다
  • ZeroMQ 핵심 은 C 언어 로 작 성 된 것 으로 C,C++,자바,python 등 다양한 프로 그래 밍 언어 를 지원 하 는 API 이 며 대부분의 운영 체제 에서
  • 을 실행 할 수 있 습 니 다.
    요약:Ø MQ(ZeroMQ)는 메시지 큐 를 기반 으로 하 는 다 중 스 레 드 네트워크 라 이브 러 리 로 네트워크 통신,메시지 큐,스 레 드 스케줄 링 등 기능 을 패키지 하여 상부 에 간결 한 API 를 제공 합 니 다.응용 프로그램 은 라 이브 러 리 파일 을 불 러 오고 API 함 수 를 호출 하여 고성능 네트워크 통신 을 실현 합 니 다.
    추상 적 으로 보인다.다음은 ZeroMQ 의 Python 패키지 인 pyzmp 와 결합 하여 ZeroMQ 의 가장 기본 적 인 작업 모델 세 가 지 를 실례 로 살 펴 보 자.
    설치
    설치 방법
    
    pip install pyzmq
    설치 성공 여부 확인
    
    >>> import zmq
    >>> print(zmq.__version__)
    22.0.3
    3.Request-reply(요청 응답 모드)
    3.1 Request-Reply 모드 개요:
  • 소식 은 쌍방 향 이 고 왕래 가 있다.
  • Client 가 요청 한 메시지 에 서버 는 반드시 Client 에 대답 해 야 합 니 다.
  • Client 가 요청 한 후에 서버 는 응답 을 해 야 합 니 다.주의:서버 가 응답 을 되 돌려 주지 않 으 면 오류 가 발생 할 수 있 습 니 다.
  • Server 와 Client 는 모두 1:N 모델 이 될 수 있 습 니 다.보통 1 은 서버,N 은 클 라 이언 트 로 본다.
  • 더 밑 에 있 는 터미널 주 소 는 상부 에 숨겨 져 있 고 모든 요청 은 응답 주 소 를 포함 하고 응용 은 관심 이 없다.
  • ZMQ 는 경로 기능(경로 기능 을 실현 하 는 구성 요 소 를 Device 라 고 함)을 잘 지원 하고 1:N 을 N:M 으로 확장 할 수 있 습 니 다.
  • Request-Reply流程
    3.2 클 라 이언 트 단 python 구현
    
    #client.py
    
    import zmq
    
    context = zmq.Context()
    
    #  Socket to talk to server
    print("Connecting to hello world server…")
    socket = context.socket(zmq.REQ)
    socket.connect("tcp://localhost:5555")
    socket.send(b"Hello")
    #  Get the reply.
    message = socket.recv()
    print(f"Received reply [ {message} ]")
    
    
    3.3 서버 엔 드 python 구현
    
    #server.py
    import time
    import zmq
    
    context = zmq.Context()
    socket = context.socket(zmq.REP)
    socket.bind("tcp://*:5555")
    
    while True:
        #  Wait for next request from client
        message = socket.recv()
        print("Received request: %s" % message)
    
        #  Do some 'work'
        time.sleep(1)
    
        #  Send reply back to client
        socket.send(b"World")
    
  • client.py 를 시작 하면 먼저 Connecting to hello World server 를 인쇄 하지만 아무런 소식 도 듣 지 않 습 니 다.
  • 그리고 server.py 를 시작 합 니 다.클 라 이언 트 는 클 라 이언 트 로부터 request 를 받 았 습 니 다.b'Hello'
  • 이때 client 단 은 server 단 에서 reply:[b'World']
  • 을 받 았 습 니 다.
    
    python client.py 
    Connecting to hello world server…
    Received reply [ b'World' ]
    
    python server.py 
    Received request: b'Hello'
    client.py 를 몇 개 더 실행 해서 상황 이 어떤 지 볼 수 있 습 니 다.
    Server和Client都可以是1:N的模型
    4.게시/구독(구독-게시 모드)
    4.1 Pub-Subs 모델 개요:
  • 소식 단 방향,가 는 곳 마다
  • 개의 게시 단,여러 개의 구독 단;게시 자 는 데이터 만 생 성하 고 게시 자 는 하나의 메 시 지 를 발표 하면 여러 구독 자 에 의 해 동시에 받 을 수 있 습 니 다.
  • 게시 자 는 구독 자의 가입 과 이탈 에 관심 을 가 질 필요 가 없고 소식 은 1:N 으로 모든 구독 자 에 게 확산 된다.
  • 방송 모든 client,대기 열 캐 시 없 이 연결 데 이 터 를 끊 으 면 영원히 잃 어 버 립 니 다.
  • 게시 단 이 정 보 를 발표 하기 시 작 했 을 때 Subscribe 단 이 연결 되 지 않 으 면 이 정 보 는 바로 버 려 집 니 다.
  • PUB 와 SUB 는 누가 bind 하고 누가 connect 하 는 지 에 대해 엄격 한 요구 가 없다(본질 은 다 르 지 않 지만).그러나 PUB 는 bind 를 사용 하고 SUB 는 connect
  • 을 사용 하 는 것 을 권장 한다.
  • SUB 를 사용 하여 구독 을 설정 할 때 zmq 를 사용 해 야 합 니 다.setsockopt()메시지 필터
  • Pub-Subs模式流程
    공식 문서 의 예 를 직접 참조 합 니 다.
    게시 자:날씨 업데이트 서버 와 유사 하여 구독 자 에 게 날씨 업 데 이 트 를 보 냅 니 다.내용 은 우편 번호,온도,습도 등 정 보 를 포함 합 니 다.
    
    #Publisher.py
    import zmq
    from random import randrange
    
    
    context = zmq.Context()
    socket = context.socket(zmq.PUB)
    socket.bind("tcp://*:5556")
    
    while True:
        zipcode = randrange(1, 100000)
        temperature = randrange(-80, 135)
        relhumidity = randrange(10, 60)
    
        socket.send_string("%i %i %i" % (zipcode, temperature, relhumidity))
    
    구독 자:게시 자가 업데이트 한 데이터 흐름 을 감청 하고 특정 우편 번호 와 관련 된 날씨 정보 만 걸 러 내 며 기본적으로 10 개의 데 이 터 를 받 습 니 다.
    
    #Subscribe.py 
    import sys
    import zmq
    
    
    #  Socket to talk to server
    context = zmq.Context()
    socket = context.socket(zmq.SUB)
    
    print("Collecting updates from weather server...")
    socket.connect("tcp://localhost:5556")
    
    # Subscribe to zipcode, default is NYC, 10001
    zip_filter = sys.argv[1] if len(sys.argv) > 1 else "10001"
    
    # Python 2 - ascii bytes to unicode str
    if isinstance(zip_filter, bytes):
        zip_filter = zip_filter.decode('ascii')
    socket.setsockopt_string(zmq.SUBSCRIBE, zip_filter)
    
    # Process 5 updates
    total_temp = 0
    for update_nbr in range(5):
        string = socket.recv_string()
        zipcode, temperature, relhumidity = string.split()
        total_temp += int(temperature)
    
    print(
        "Average temperature for zipcode '%s' was %dF"
        % (zip_filter, total_temp / (update_nbr + 1))
    )
    
    消息会以 1:N 的方式扩散到每个订阅者
    5.Push/Pull(라인 모드)
    5.1 유수 선 모드 개요:
  • 은 주로 다 중 태 스 크 병행 에 사용 된다.
  • 소식 은 단 방향 으로 가 고 돌아 오지 않 는 다.
  • Push 의 어떤 소식 도 하나의 Pull 단 에서 만 소식 을 받 을 수 있 습 니 다.
  • Push 엔 드 든 Pull 엔 드 든 server 를 할 수 있 고 bid 는 특정한 주소 로 상대방 의 방문 을 기다 릴 수 있 습 니 다.
  • 여러 개의 PULL 단 이 동시에 PUSH 단 에 연결 되면 PUSH 단 은 내부 에 부하 균형 을 이 루 고 평균 적 으로 분 배 된 알고리즘 을 사용 하여 모든 정 보 를 PULL 단 에 균형 있 게 발표 합 니 다.
  • 은 세 부분 으로 구성 되 어 있 으 며 Push 는 데이터 푸 시 를 하고 work 는 데이터 캐 시 를 하 며 Pull 은 데이터 경쟁 획득 처 리 를 한다.
  • 에 데이터 캐 시 와 처리 부하 가 존재 합 니 다.연결 이 끊 어 지면 데 이 터 를 잃 어 버 리 지 않 고 다시 연결 한 후에 데 이 터 를 계속 대 단 으로 보 냅 니 다.
  • Push/Pull模式流程
    ventilator 는 SOCKET 를 사용 합 니 다.PUSH,Worker 노드 에 작업 을 나 누 어 줍 니 다.Worker 노드 에서 SOCKET 사용PULL 상류 에서 퀘 스 트 를 받 고 SOCKET 사용PUSH 는 결 과 를 Sink 에 모 았 습 니 다.주의해 야 할 것 은 임 무 를 나 눠 줄 때 도 부하 균형 을 이 루 는 경로 기능 이 있다 는 점 이다.워 커 는 언제든지 자 유 롭 게 가입 할 수 있 고,ventilator 는 임 무 를 균형 있 게 나 눠 줄 수 있다.
    Push/Pull 모드 는 자주 사용 되 는데,여기 서 우 리 는 주로 그것 의 부하 균형 을 테스트 합 니 다.
    5.2 Ventilator
    
    # ventilator.py
    import zmq
    import time
    
    context = zmq.Context()
    socket = context.socket(zmq.PUSH)
    socket.bind("tcp://*:5557")
    
    while True:
        socket.send(b"test")
        print("   ")
        time.sleep(1)
    
    5.3 worker
    
    # worker.py
    import zmq
    
    context = zmq.Context()
    
    recive = context.socket(zmq.PULL)
    recive.connect('tcp://127.0.0.1:5557')
    
    sender = context.socket(zmq.PUSH)
    sender.connect('tcp://127.0.0.1:5558')
    
    while True:
        data = recive.recv()
        print("work1     ...")
        sender.send(data)
    
    5.4 sink
    
    # sink.py
    import zmq
    import sys
    
    context = zmq.Context()
    socket = context.socket(zmq.PULL)
    socket.bind("tcp://*:5558")
    
    while True:
        response = socket.recv()
        print("response: %s" % response)
    
    터미널 4 개 를 열 고 각각 실행 합 니 다.
    
    python sink.py
    python worker.py
    python worker.py
    python ventilator.py
    采用平均分配的算法,将所有消息均衡发布到PULL端上
    총화
    메시지 모델 은 수요 에 따라 조합 하여 사용 할 수 있 고 후속 적 인 대리 모델 과 경로 모델 등 은 모두 세 가지 기본 모델 에서 의 확장 이나 변이 이다.
    파 이 썬 네트워크 프로 그래 밍 의 ZeroMQ 지식 총화 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 ZeroMQ 지식 총화 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기