【관련 학습 권장 사항: python tutorial】
ZMQ(이하 ZeroMQ는 ZMQ로 약칭함)는 간단하고 사용하기 쉬운 전송 계층입니다. , 프레임워크 라이브러리와 같은 소켓을 사용하면 소켓 프로그래밍을 더 간단하고 간결하며 성능이 향상됩니다.
은 여러 스레드, 코어 및 호스트 상자에 걸쳐 탄력적으로 확장되는 메시지 처리 대기열 라이브러리입니다. ZMQ의 명시된 목표는 "표준 네트워크 프로토콜 스택의 일부가 되고 나중에 Linux 커널에 들어가는 것"입니다.
ZMQ를 사용하면 고성능 네트워크 애플리케이션을 매우 쉽고 재미있게 작성할 수 있습니다.
ZeroMQ는 소켓 캡슐화가 아니며 기존 네트워크 프로토콜을 구현하는 데 사용할 수 없습니다.
하위 수준의 지점 간 통신 모드와는 다른 자체 모드가 있습니다.
tcp 프로토콜보다 더 높은 수준의 프로토콜을 가지고 있습니다. (물론 ZeroMQ는 반드시 TCP 프로토콜을 기반으로 하는 것은 아니며 프로세스 간 및 프로세스 내 통신에도 사용할 수 있습니다.)
zeromq
并不是类似rabbitmq
메시지 큐, 실제로는 메시지 큐 구성 요소이자 라이브러리일 뿐입니다. ㅋㅋㅋ
zeromq.github.io / pyzmq/
zguide.zeromq.org/py:all | |
---|---|
pip install pyzmq | |
1의 여러 모드. 응답 모드(요청-응답) (담당자 및 요청) | |
2 구독 게시 모드(pub 및 sub) |
1. 요청-응답 모드(요청 응답 모델):
클라이언트가 요청한 후 서버가 응답해야 합니다. 클라이언트는 요청을 시작하고 서버가 요청에 응답할 때까지 기다립니다. 클라이언트 측에서는 송신 및 수신 쌍이 있어야 합니다.반대로 서버 측에서는 송신 및 수신 쌍이 있어야 합니다. 서버와 클라이언트 모두 1:N 모델이 가능합니다. 일반적으로 1은 서버로 간주되고 N은 클라이언트로 간주됩니다.
ZMQ는 라우팅 기능을 매우 잘 지원할 수 있으며(라우팅 기능을 구현하는 구성 요소를 장치라고 함) 1:N에서 N:M으로 확장할 수 있습니다(몇 개의 라우팅 노드만 추가하면 됩니다). 이 모델에서는 하위 레벨 엔드포인트 주소가 상위 레이어로부터 숨겨집니다. 응답 주소는 모든 요청에 암시되어 있으며 애플리케이션은 이에 대해 신경 쓰지 않습니다.
Server:
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 -구독 모드(게시-구독 모델):
모든 클라이언트에게 방송되며 대기열 캐시가 없으며 연결이 끊긴 데이터는 영원히 손실됩니다. 클라이언트는 데이터 필터링을 수행할 수 있습니다.
Serverimport 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
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)
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)
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!