[Python]zeromq:socket request/receive, 发布/订阅消息, 进程间通讯

Request/Response

Server:
import zmq

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
    message = socket.recv()  
    print "Received request: ", message  
    socket.send('Message from server...received')  
Client:
import zmq

context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")

print "Sending request ..."  
socket.send ("Hello")        
message = socket.recv()  
print message

Single Part

Publish server:
import time
from random import choice
from random import randrange
import zmq

stock_symbols = [u'谷歌', 'RAX', 'EMC', 'GOOG', 'AAPL', 'RHAT', 'AMZN']

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5555")

while True:
    time.sleep(0.5)
    stock_symbol = choice(stock_symbols).encode('utf-8')
    stock_price = str(randrange(1, 100)).encode('utf-8')
    msg = "{0} ${1}".format(stock_symbol, stock_price)
    print "Sending Message: {0}".format(msg).decode('utf-8')
    socket.send(msg)
Client:
import zmq

# 只订阅topic中的
topic = [u'谷歌', "GOOG", "RAX"]
context = zmq.Context()
socket = context.socket(zmq.SUB)
for top in topic:
    socket.setsockopt(zmq.SUBSCRIBE, top.encode('utf-8'))
socket.connect("tcp://127.0.0.1:5555")

while True:
    msg = socket.recv()
    print msg.decode('utf-8')

Multiple Parts

Publish server:
import time
from random import choice
from random import randrange 
import zmq
stock_symbols = [u'谷歌', 'RAX', 'EMC', 'GOOG', 'AAPL', 'RHAT', 'AMZN']

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5555")

while True:
    time.sleep(0.5)
    stock_symbol = choice(stock_symbols).encode('utf-8')
    stock_price = str(randrange(1, 100)).encode('utf-8')

    msg = "{0} ${1}".format(stock_symbol, stock_price)
    print "Sending Message: {0}".format(msg).decode('utf-8')
    socket.send_multipart([stock_symbol, stock_price])
Client:
import zmq

# 只订阅topic内的
topic = [u'谷歌', "GOOG", "RAX"]
context = zmq.Context()
socket = context.socket(zmq.SUB)
for top in topic:
    socket.setsockopt(zmq.SUBSCRIBE, top.encode('utf-8'))
socket.connect("tcp://127.0.0.1:5555")

while True:
    topic, msg = socket.recv_multipart()
    print topic.decode('utf-8'), '$'+msg.decode('utf-8')

Json

Publish Server:
import time
from random import choice
from random import randrange

import zmq
import json

stock_symbols = [u'谷歌', 'RAX', 'EMC', 'GOOG', 'AAPL', 'RHAT', 'AMZN']

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5555")

while True:
    time.sleep(0.5)
    stock_symbol = choice(stock_symbols).encode('utf-8')
    stock_price = str(randrange(1, 100)).encode('utf-8')

    msg = {'Name': stock_symbol, 'Price': stock_price}
    print "Sending Message: {0}".format(msg).decode('utf-8')
    socket.send_json(msg)
Client:
import zmq

context = zmq.Context()
socket = context.socket(zmq.SUB)
#不可过滤订阅内容
socket.setsockopt(zmq.SUBSCRIBE, '')
socket.connect("tcp://127.0.0.1:5555")

while True:
    msg = socket.recv_json()
    print msg

Multiple Parts 带Json,可过滤

Publish Server:
import time
from random import choice
from random import randrange

import zmq
import json

stock_symbols = [u'谷歌', 'RAX', 'EMC', 'GOOG', 'AAPL', 'RHAT', 'AMZN']

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5555")

while True:
    time.sleep(0.5)
    stock_symbol = choice(stock_symbols).encode('utf-8')
    stock_price = str(randrange(1, 100)).encode('utf-8')

    msg = {'Name': stock_symbol, 'Price': stock_price}
    print "Sending Message: {0}".format(msg).decode('utf-8')
    socket.send_multipart([stock_symbol, json.dumps(msg)])
Client:
import zmq, json

topic = [u'谷歌', "GOOG", "RAX"]
context = zmq.Context()
socket = context.socket(zmq.SUB)
for top in topic:
    socket.setsockopt(zmq.SUBSCRIBE, top.encode('utf-8'))
socket.connect("tcp://127.0.0.1:5555")

while True:
    topic, msg = socket.recv_multipart()
    print json.loads(msg)

转自:http://www.giantflyingsaucer.com/blog/?p=4967

### 关于手写RPC框架的GitHub项目或教程 对于希望构建自己的远程过程调用(Remote Procedure Call, RPC)系统的开发者而言,存在多个有价值的资源可以借鉴。虽然特定的手写RPC框架可能不如某些成熟的库那样广泛为人所知,但在开源社区中仍能找到不少优秀的实例。 #### 使用Git命令查找和学习手写RPC框架 为了找到合适的手写RPC框架项目,建议利用基本的`git clone`, `git pull`, 和其他基础命令来获取并跟踪这些项目的最新进展[^1]。通过这种方式,能够专注于实际功能的学习而非复杂的版本控制系统内部机制。 #### 推荐的GitHub项目 - **grpc/grpc**: 虽然这不是严格意义上的“手写”RPC框架,但gRPC是一个非常流行的高性能RPC框架,其源码提供了大量实现细节上的启示。 - **etcd-io/etcd**: etcd中的Raft协议实现了分布式一致性算法,并且包含了简单的客户端RPC接口设计思路。 - **apache/thrift**: Apache Thrift不仅支持多种编程语言之间的通信,还提供了一个简易版的自定义传输层和服务端处理逻辑作为参考。 #### 教程推荐 - **Building an HTTP-based JSON-RPC Server in Python** 这篇博客文章介绍了如何基于HTTP协议创建JSON-RPC服务器,在Python环境下逐步解析每一个组件的工作原理以及它们是如何协同工作的。 - **Implementing a Simple RPC System Using ZeroMQ** 利用了ZeroMQ消息队列特性,这篇文章展示了怎样快速搭建起一套轻量级的服务间通讯解决方案,非常适合初学者理解和实践。 ```python import zmq context = zmq.Context() socket = context.socket(zmq.REP) socket.bind("tcp://*:5555") while True: message = socket.recv_string() # Receive request from client print(f"Received request: {message}") reply = f"Echo: {message}" # Process the received data here... socket.send_string(reply) # Send back response to client ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值