>  기사  >  백엔드 개발  >  Pyzmq 소개

Pyzmq 소개

coldplay.xixi
coldplay.xixi앞으로
2020-09-02 17:19:4135498검색

【관련 학습 권장 사항: python tutorial

Pyzmq 소개

ZMQ(이하 ZeroMQ는 ZMQ로 약칭함)는 간단하고 사용하기 쉬운 전송 계층입니다. , 프레임워크 라이브러리와 같은 소켓을 사용하면 소켓 프로그래밍을 더 간단하고 간결하며 성능이 향상됩니다.

은 여러 스레드, 코어 및 호스트 상자에 걸쳐 탄력적으로 확장되는 메시지 처리 대기열 라이브러리입니다. ZMQ의 명시된 목표는 "표준 네트워크 프로토콜 스택의 일부가 되고 나중에 Linux 커널에 들어가는 것"입니다.

ZMQ를 사용하면 고성능 네트워크 애플리케이션을 매우 쉽고 재미있게 작성할 수 있습니다.

ZeroMQ는 소켓 캡슐화가 아니며 기존 네트워크 프로토콜을 구현하는 데 사용할 수 없습니다.

하위 수준의 지점 간 통신 모드와는 다른 자체 모드가 있습니다.

tcp 프로토콜보다 더 높은 수준의 프로토콜을 가지고 있습니다. (물론 ZeroMQ는 반드시 TCP 프로토콜을 기반으로 하는 것은 아니며 프로세스 간 및 프로세스 내 통신에도 사용할 수 있습니다.)

zeromq 并不是类似rabbitmq메시지 큐, 실제로는 메시지 큐 구성 요소이자 라이브러리일 뿐입니다. ㅋㅋㅋ

Docs


zeromq.github.io / pyzmq/

Guidezguide.zeromq.org/py:allDownload Pyzmq1의 여러 모드. 응답 모드(요청-응답) (담당자 및 요청) 메시지는 양방향으로 오고 갑니다. 요청측에서 요청한 메시지의 경우 담당자가 요청측에 응답해야 합니다.2 구독 게시 모드(pub 및 sub) 메시지 예, 돌아올 수 없습니다. 게시 측은 특정 주제에 대한 메시지를 게시할 수 있고, 구독하는 측은 자신이 구독한 주제만 수신할 수 있습니다. 게시자는 여러 구독자가 수신할 수 있는 메시지를 게시합니다.
pip install pyzmq

3. 푸시 풀 모드

메시지는 단방향이며 돌아올 수 없습니다. 푸시된 메시지의 경우 하나의 풀 엔드만 메시지를 수신합니다.

다음 프록시 모드와 라우팅 모드는 모두 세 가지 기본 모드의 확장 또는 변형입니다.

1. 요청-응답 모드(요청 응답 모델):

클라이언트가 요청한 후 서버가 응답해야 합니다.

클라이언트는 요청을 시작하고 서버가 요청에 응답할 때까지 기다립니다. 클라이언트 측에서는 송신 및 수신 쌍이 있어야 합니다.

반대로 서버 측에서는 송신 및 수신 쌍이 있어야 합니다. 서버와 클라이언트 모두 1:N 모델이 가능합니다. 일반적으로 1은 서버로 간주되고 N은 클라이언트로 간주됩니다.

ZMQ는 라우팅 기능을 매우 잘 지원할 수 있으며(라우팅 기능을 구현하는 구성 요소를 장치라고 함) 1:N에서 N:M으로 확장할 수 있습니다(몇 개의 라우팅 노드만 추가하면 됩니다).

이 모델에서는 하위 레벨 엔드포인트 주소가 상위 레이어로부터 숨겨집니다. 응답 주소는 모든 요청에 ​​암시되어 있으며 애플리케이션은 이에 대해 신경 쓰지 않습니다.

Server:

sever.py
 import zmq import sys
 context = zmq.Context()
 socket = context.socket(zmq.REP)
 socket.bind("tcp://*:5555")
 while True:
  try:
  print("wait for client ...")
  message = socket.recv()
  print("message from client:", message.decode('utf-8'))
  socket.send(message)
  except Exception as e:
  print('异常:',e)
  sys.exit()
Client:

#client.py

 import zmq import sys
 context = zmq.Context()
 print("Connecting to server...")
 socket = context.socket(zmq.REQ)
 socket.connect("tcp://localhost:5555")
 while True:
 
  input1 = input("请输入内容:").strip()
  if input1 == 'b':
  sys.exit()
  socket.send(input1.encode('utf-8'))
 
  message = socket.recv()
  print("Received reply: ", message.decode('utf-8'))

2.Publish -구독 모드(게시-구독 모델):

모든 클라이언트에게 방송되며 대기열 캐시가 없으며 연결이 끊긴 데이터는 영원히 손실됩니다. 클라이언트는 데이터 필터링을 수행할 수 있습니다.

Server

server.py

 import zmq import time import sys
 context = zmq.Context()
 socket = context.socket(zmq.PUB)
 socket.bind("tcp://*:5555")
 
 while True:
  msg = input("请输入要发布的信息:").strip()
  if msg == 'b':
  sys.exit()
  socket.send(msg.encode('utf-8'))
  time.sleep(1)
Client1

client1.py
 import zmq
 
 
 context = zmq.Context()
 socket = context.socket(zmq.SUB)
 socket.connect("tcp://localhost:5555")
 socket.setsockopt(zmq.SUBSCRIBE,''.encode('utf-8'))  # 接收所有消息 while True:
  response = socket.recv().decode('utf-8');
  print("response: %s" % response)

Client2

client2.py

 import zmq
 context = zmq.Context()
 socket = context.socket(zmq.SUB)
 socket.connect("tcp://localhost:5555")
 socket.setsockopt(zmq.SUBSCRIBE,'123'.encode('utf-8'))  # 消息过滤  只接受123开头的信息 while True:
  response = socket.recv().decode('utf-8');
  print("response: %s" % response)

3. 병렬 파이프라인 모드(파이프라인 모델):

세 부분으로 구성되어 있습니다 : 데이터 푸시를 위한 푸시, 데이터 캐싱을 위한 작업, 데이터 경쟁 획득 처리를 위한 풀입니다. Publish-Subscribe와는 다르게 데이터 캐시와 처리 부하가 있습니다.

연결이 끊어져도 데이터는 손실되지 않으며, 다시 연결된 후에도 데이터는 계속해서 상대방에게 전송됩니다.

server.py

 import zmq import time
 
 context = zmq.Context()
 socket = context.socket(zmq.PUSH)
 socket.bind("tcp://*:5557")
 
 while True:
  msg = input("请输入要发布的信息:").strip()
  socket.send(msg.encode('utf-8'))
  print("已发送")
  time.sleep(1)

worker.py

 import zmq
 context = zmq.Context()
 receive = context.socket(zmq.PULL)
 receive.connect('tcp://127.0.0.1:5557')
 sender = context.socket(zmq.PUSH)
 sender.connect('tcp://127.0.0.1:5558')
 
 while True:
  data = receive.recv()
  print("正在转发...")
  sender.send(data)

client.py

 import zmq
 context = zmq.Context()
 socket = context.socket(zmq.PULL)
 socket.bind("tcp://*:5558")
 
 while True:
  response = socket.recv().decode('utf-8')
  print("response: %s" % response)

위 내용은 Pyzmq 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제