要求:

文件分布:

流程图:

import pika
import os
import socket class Server(object):
def __init__(self, queuename):
self.queuename = queuename
self.connection = pika.BlockingConnection(pika.ConnectionParameters(host = 'localhost'))
self.channel = self.connection.channel() #声明一个管道
self.channel.queue_declare(queue=self.queuename)
def handle(self,command):
message = os.popen(command.decode()).read()
if not message:
message = 'wrong command'
return message
def on_requet(self, ch, method,props,body):
response = self.handle(body)
print(response)
ch.basic_publish(exchange='',
routing_key=props.reply_to, #拿到客户端随机生成的queue
properties = pika.BasicProperties(correlation_id = props.correlation_id),
body = str(response))
ch.basic_ack(delivery_tag = method.delivery_tag)#确保任务完成 def start(self):
self.channel.basic_consume(self.on_requet, queue=self.queuename) #收到消息就调用on_requet
print(" [x] Awaiting RPC requests")
self.channel.start_consuming() if __name__ == "__main__":
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname) # 获取本地ip地址作为queue name
print(ip)
queue_name = ip
server = Server(queue_name)
server.start()

server

 import pika
import uuid
import random
import threading class Client(object):
def __init__(self):
self.connection = pika.BlockingConnection(pika.ConnectionParameters(host = 'localhost'))
self.channel = self.connection.channel() def on_response(self, ch, method, props, body):
if self.callback_id == props.correlation_id:
self.response = body
ch.basic_ack(delivery_tag=method.delivery_tag) def get_response(self, callback_queue, corr_id):
self.response = None
self.callback_id = corr_id
self.channel.basic_consume(self.on_response, queue=callback_queue)
while self.response is None:
self.connection.process_data_events() # 非阻塞版的start_consuming
return self.response def call(self, queuename, n):
# 声明临时的回调队列
result = self.channel.queue_declare(exclusive=False)
self.callback_queue = result.method.queue
self.corr_id = str(uuid.uuid4())
self.channel.basic_publish(exchange='',
routing_key=queuename,
properties=pika.BasicProperties(
reply_to=self.callback_queue,
correlation_id = self.corr_id,
),
body = n)
return self.callback_queue, self.corr_id class Threading(object):
def __init__(self):
self.info={} def check_all(self, cmd):
'''
查看已经有的任务id
:param cmd:
:return:
'''
for i in self.info:
print('task id: %s, host: %s, command:%s' % (i, self.info[i][0], self.info[i][1])) def check_task(self, cmd_id):
'''
查看运行结果
:param cmd_id:
:return:
'''
try:
id = int(cmd_id.split()[1])
callack_queue = self.info[id][2]
callack_id=self.info[id][3]
client = Client()
res = client.get_response(callack_queue, callack_id)
print(res.decode())
del self.info[id]
except Exception as e:
print(e) def run(self, cmd):
comm = cmd.split("\"")[1]
hosts = cmd.split("--")
host = hosts[1].split()[1:] #拿ip地址
for i in host:
id = random.randint(10000,99999)
obj = Client()
res = obj.call(i, comm)
self.info[id] = [i,comm,res[0], res[1]]
return self.info def ref(self, cmd):
'''
反射
:param cmd:
:return:
'''
str = cmd.split()[0]
if hasattr(self,str):
func = getattr(self,str)
r = func(cmd)
if r is not None:
for i in r:
print('task id: %s, host: %s, command:%s' % (i, r[i][0], r[i][1])) def thread(self):
while True:
cmd = input("->>").strip()
if not cmd:continue
t1 = threading.Thread(target=self.ref, args=(cmd, ))
t1.start() obj = Threading()
res = obj.thread()

cliernt

基于RabbitMQ rpc实现的主机管理的更多相关文章

  1. python作业(第十一周)基于RabbitMQ rpc实现的主机管理

    作业需求: 可以对指定机器异步的执行多个命令 例子: >>:run "df -h" --hosts 192.168.3.55 10.4.3.4 task id: 453 ...

  2. 基于RabbitMQ的跨平台RPC框架

    RabbitMQRpc protocobuf RabbitMQ 实现RPC https://www.cnblogs.com/LiangSW/p/6216537.html 基于RabbitMQ的RPC ...

  3. 基于Quqrtz.NET 做的任务调度管理工具

    基于Quqrtz.NET 做的任务调度管理工具 国庆前,需求让我看了一下任务调度的数据表设计.和之前一样,有100多个字段,p1 ~ p100, 我说这是干嘛啊!按这写,写死去了! 然后在网上搜了一下 ...

  4. Django + Ansible 主机管理(有源码)

    本文给大家介绍如何利用 Django + Ansible 进行 Web 项目管理.   Django介绍 一个可以使 Web 开发工作愉快并且高效的 Web 开发框架,能够以最小的代价构建和维护高质量 ...

  5. Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  6. C#基于RabbitMQ实现客户端之间消息通讯实战演练

    一.背景介绍和描述 MQ消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.何时需要消息队列?当你需要使用 ...

  7. 一个基于RabbitMQ的可复用的事务消息方案

    前提 分布式事务是微服务实践中一个比较棘手的问题,在笔者所实施的微服务实践方案中,都采用了折中或者规避强一致性的方案.参考Ebay多年前提出的本地消息表方案,基于RabbitMQ和MySQL(JDBC ...

  8. rabbitMQ安装docker版 /权限管理命令

    1.进入docker hub镜像仓库地址:https://hub.docker.com/ 2.搜素rabbitMQ 查询镜像,可以看到多种类型,选择带有web页面的(managment) 3.拉取镜像 ...

  9. 基于rabbitmq延迟插件实现分布式延迟任务

    承接上文基于redis,redisson的延迟队列实践,今天介绍下基于rabbitmq延迟插件rabbitmq_delayed_message_exchange实现延迟任务. 一.延迟任务的使用场景 ...

随机推荐

  1. insert into TABLE by SELECT ...

    insert into isp_rmi3 ( select r.id, r.blue_id, r.sell_channel,NULL, r.interface_id, NULL, NULL, r.ur ...

  2. ok6410如何从sdram中启动uboot 调试 这是一个猜想还没有验证

    1\在smdk6410.h中定义宏 //#define CONFIG_SKIP_LOWLEVEL_INIT 1 //#define CONFIG_SKIP_RELOCATE_UBOOT 12\将编译的 ...

  3. web开发前端面试知识点目录整理

    web开发前端面试知识点目录整理 基本功考察 关于Html 1. html语义化标签的理解; 结构化的理解; 能否写出简洁的html结构; SEO优化 2. h5中新增的属性; 如自定义属性data, ...

  4. 取代iframe,实现页面中引入别的页面

    <li> <a href="#addChannel">添加通道</a> </li> window.onload = rightCha ...

  5. 2.3JAVA基础复习——JAVA语言的基础组成函数

    JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...

  6. 非常全的VsCode快捷键

    按 Press 功能 Function Ctrl + Shift + P,F1 显示命令面板 Show Command Palette Ctrl + P 快速打开 Quick Open Ctrl + ...

  7. Windows Server Backup(2016) 备份

    1. 使用 Windows Server Backup 备份 如果服务器没有启用 Windows Server Backup,需要打开服务器管理器,如下图 点击添加角色和功能,根据向导,添加 Wind ...

  8. LuoguP2617 Dynamic Rankings (动态主席树学习理解)

    题目地址 题目链接 题解 动态主席树的板子题.动态主席树其实和静态的有很大差别,虽然同样是n个根,但是节点并不能共用,每个根节点表示bit上的一段区间. 所以其实是个树套树的东西来着,外层是bit,内 ...

  9. C++ 基本数据类型,常量,变量

    基本数据类型 整数类型 基本的整数类型(int) 按符号分 符号的 (signed) 无符号的(unsigned) 按照数据范围分 短整数(short) 长整数(long) 长长整数(long lon ...

  10. Git Learning3 Eclipse Tools(未完成)

    1.创建Git 操作:工程 右键 Team Share Project Git 完成创建 2.全局设置:Window->Preference->Git->Configuration- ...