Python案例-网络编程-使用RabbitMQ实现RPC简易分享
来源:互联网 发布:鑫众棋牌源码 编辑:程序博客网 时间:2024/05/29 10:11
RPC(Remote Procedure Call Protocol)-远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC 采用C/S模式。首先,客户机调用进程发送一个有进程参数的调用消息到服务端的消息队列里,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
关于RPC详情,可参考这里
RabbitMQ:可复用的企业消息系统。
MQ(Message Queue), 消息队列。具体关于队列的理解可以参考本专栏的异步解耦篇(消费者生产者模型)
RabbitMQ安装
#安装配置epel源rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm#安装erlangyum -y install erlang#安装RabbitMQyum -y install rabbitmq-server
在生产和消费模型中来讲 ,使用 RabbitMQ,相当于不再关注内存中的Queue对象了,而是由某台服务器上的RabbitMQ Server实现的消息队列。
client:
#!/usr/bin/env python# -- coding = 'utf-8' --# Author Allen Lee# Python Version 3.5.1# OS Windows 7import pikaimport sysclass rpc_client: def __init__(self): self.connection = pika.BlockingConnection(pika.ConnectionParameters( host='127.0.0.1' )) self.channel = connection.channel() self.channel.exchange_declare(exchange='rpc_channel', type='fanout') #收消息时的回调函数 def callback_client(ch,method,properties,body): print(body) #发 def put_msg(self): while True: message=input('>>: ').strip() if Len(message) == 0 : break channel.basic_publish(exchange='logs_fanout', routing_key='', body=message) connection.close() #收 def get_msg(self): while True: #随机创建队列 result = channel.queue_declare(exclusive=True) queue_name = result.method.queue #绑定 self.channel.queue_bind(exchange='rpc_channel', queue=queue_name) self.channel.basic_consume(self.callback_client, queue=queue_name, no_ack=True) self.channel.start_consuming()client = rpc_client()client.put_msg()client.get_msg()
server:
#!/usr/bin/env python# -- coding = 'utf-8' --# Author Allen Lee# Python Version 3.5.1# OS Windows 7import pikaimport subprocessclass rpc_server: #接收消息放在构造方法中 def __init__(self): self.connection = pika.BlockingConnection(pika.ConnectionParameters( host='127.0.0.1')) self.channel = connection.channel() self.channel.exchange_declare(exchange='rpc_channel', type='fanout') #随机创建队列 result = channel.queue_declare(exclusive=True) queue_name = result.method.queue #绑定 self.channel.queue_bind(exchange='rpc_channel', queue=queue_name) self.channel.basic_consume(self.callback_server, queue=queue_name, no_ack=True) self.channel.start_consuming() #将发消息放在callback方法中 def callback_server(ch,method,properties,body): result = subprocess.Popen(body,shell=True,stdout=subprocess.PIPE) ret = result.stdout.read() if not ret: message = 'there is no such commons' print(send_data) else: message = ret #将回显发送给client channel.basic_publish(exchange='rpc_channel', routing_key='', body=message)server = rpc_server()
0 0
- Python案例-网络编程-使用RabbitMQ实现RPC简易分享
- 使用Android网络编程实现简易聊天室
- 使用Android网络编程实现简易聊天室
- 使用Android网络编程实现简易聊天室
- 使用Android网络编程实现简易聊天室
- 使用Android网络编程实现简易聊天室
- 网络编程案例简易新闻客户端
- 使用Java实现简易RPC框架
- rabbitmq RPC java实现
- RabbitMQ实现RPC技术
- RabbitMQ之RPC实现
- RabbitMQ实现RPC(java)
- python实现简易网络爬虫
- python系列之 RabbitMQ - RPC
- 网络编程小案例之简易新闻客户端
- 使用go reflect实现一套简易的rpc框架
- 使用Rabbitmq/spring进行RPC
- 使用Rabbitmq/spring进行RPC
- 在小型Web系统中使用缓存加速访问
- HDU - 5775 Bubble Sort(树状数组)
- 杭电-1241 Oil Deposits(广搜)
- 面经 汇总
- 12346
- Python案例-网络编程-使用RabbitMQ实现RPC简易分享
- jQuery动画效果(show与hide/toggle/slideUp/slideToggle/fadeIn/fadeTo)
- 知识点
- HDU1312 BFS-Numerically Speaking
- [LightOJ 1265] Island of Survival (概率)
- 【博弈论】POJ[2348]Euclid's Game
- tjut 4655
- JavaEE程序猿的Java世界观⑤
- 元数据