要求:

文件分布:

流程图:

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. vuex 入坑篇

    Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 这个状态自管理应用包含 ...

  2. 类与对象 && 继承

      以下是本人的对类与对象.继承的一些理解,如有错误之处万望谅解,如有朋友愿意指正,十分乐意,万分感谢!   类与对象     类与对象是学习编程的基础(大概吧),那么何为类?何为对象呢?   一.简 ...

  3. redis参数说明

    感谢网友分享. 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2. 当Redis以守护进程方式运行时,Redis默认会把pid写 ...

  4. 基于ROS的人脸识别

    #!/usr/bin/env python # -*- coding: utf-8 -*- import rospy import cv2 import numpy as np from sensor ...

  5. vue环境命令

    1.下载安装note.js用于VUE开发环境 2.VUE项目开发环境安装依赖,命令行进入项目代码目录下执行如下命令npm install 3.开发环境运行npm run dev 4.打包项目npm r ...

  6. iOS进阶之正则表达式

    最近一直在弄正则表达式,于是在这里整理一下,便于日后查阅. 1.常用符号 ^:字符串的开始 $:字符串的结束 *:表示零个或若干个 ?:表示零个或一个 +:表示一个或若干个 | :表示 或 操作 . ...

  7. 评价指标整理:Precision, Recall, F-score, TPR, FPR, TNR, FNR, AUC, Accuracy

    针对二分类的结果,对模型进行评估,通常有以下几种方法: Precision.Recall.F-score(F1-measure)TPR.FPR.TNR.FNR.AUCAccuracy   真实结果 1 ...

  8. python 包 笔记

    绝对导入和相对导入 我们的最顶级包glance是写给别人用的,然后在glance包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式: 绝对导入:以glance作为起始 相对导入: ...

  9. Bugku-CTF之备份是个好习惯

    Day17 备份是个好习惯 听说备份是个好习惯 http://123.206.87.240:8002/web16/

  10. 王之泰 201771010131《面向对象程序设计(java)》第十六周学习总结

        第一部分:理论知识学习部分 第14章 并发 ⚫ 线程的概念⚫ 中断线程⚫ 线程状态⚫ 多线程调度⚫ 线程同步 1.程序与进程的概念 1.1程序是一段静态的代码,它是应用程序执行的蓝 本. 1. ...