基于RabbitMQ rpc实现的主机管理
要求:
文件分布:

流程图:

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实现的主机管理的更多相关文章
- python作业(第十一周)基于RabbitMQ rpc实现的主机管理
作业需求: 可以对指定机器异步的执行多个命令 例子: >>:run "df -h" --hosts 192.168.3.55 10.4.3.4 task id: 453 ...
- 基于RabbitMQ的跨平台RPC框架
RabbitMQRpc protocobuf RabbitMQ 实现RPC https://www.cnblogs.com/LiangSW/p/6216537.html 基于RabbitMQ的RPC ...
- 基于Quqrtz.NET 做的任务调度管理工具
基于Quqrtz.NET 做的任务调度管理工具 国庆前,需求让我看了一下任务调度的数据表设计.和之前一样,有100多个字段,p1 ~ p100, 我说这是干嘛啊!按这写,写死去了! 然后在网上搜了一下 ...
- Django + Ansible 主机管理(有源码)
本文给大家介绍如何利用 Django + Ansible 进行 Web 项目管理. Django介绍 一个可以使 Web 开发工作愉快并且高效的 Web 开发框架,能够以最小的代价构建和维护高质量 ...
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
Go/Python/Erlang编程语言对比分析及示例 本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...
- C#基于RabbitMQ实现客户端之间消息通讯实战演练
一.背景介绍和描述 MQ消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.何时需要消息队列?当你需要使用 ...
- 一个基于RabbitMQ的可复用的事务消息方案
前提 分布式事务是微服务实践中一个比较棘手的问题,在笔者所实施的微服务实践方案中,都采用了折中或者规避强一致性的方案.参考Ebay多年前提出的本地消息表方案,基于RabbitMQ和MySQL(JDBC ...
- rabbitMQ安装docker版 /权限管理命令
1.进入docker hub镜像仓库地址:https://hub.docker.com/ 2.搜素rabbitMQ 查询镜像,可以看到多种类型,选择带有web页面的(managment) 3.拉取镜像 ...
- 基于rabbitmq延迟插件实现分布式延迟任务
承接上文基于redis,redisson的延迟队列实践,今天介绍下基于rabbitmq延迟插件rabbitmq_delayed_message_exchange实现延迟任务. 一.延迟任务的使用场景 ...
随机推荐
- docker tmpfs 的测试结果
创建 2G 内存的 Container 使用tmpfs挂载到 /tmp docker run --rm -it --memory 2g --mount type=tmpfs,destination=/ ...
- 安装mysql5.6
1.创建一个不能登录的的用户: 2.下载一个数据库包: wget 下载网址 3.安装相关依赖包: yum -y install make gcc-c++ cmake bison-devel ncurs ...
- textspan 转连接
import 'package:flutter/material.dart'; import 'package:flutter/gestures.dart'; import 'package:url_ ...
- Mac休眠后解决卡死转圈问题
不知什么时候MacBookPro出现盒盖休眠后Wifi连不上,卡死,转圈问题 在网上搜索解决了下,具体什么原因先不用管了,有时间升级下系统 sudo killall airportd 应该是Mojav ...
- Pycharm在运行过程中,查看每个变量的方法(show variables)跟终端一样显示变量
点击运行栏的这个灰色向下剪头: 在出现的窗口上,勾选上: 点击OK,重启Pycharm:接着点击Run窗口: 将Run的show variables图标勾选: 然后你就会发现,在右边出现了变量的窗口:
- P2495 [SDOI2011]消耗战
思路 虚树上DP 虚树相当于一颗包含了所有询问的关键点信息的树,包含的所有点只有询问点和它们的LCA,所以点数是\(2k\)级别的,这样的话复杂度就是\(O(\sum k)\),复杂度就对了 虚树重点 ...
- [译]RabbitMQ教程C#版 - 远程过程调用(RPC)
先决条件 本教程假定 RabbitMQ 已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难, ...
- Python汉诺塔
import turtle class Stack: def __init__(self): self.items = [] def isEmpty(self): return len(self.it ...
- Java基本语法(一)
1,Java中命名规则与规范 命名规则是我们必须遵守的约定: 1,Java中需要命名的地方(我们称之为标识符),可以26个英文字母(不区分大小写),0-9的数字,_和$等组成,不能包含特殊字符(#), ...
- mybatis之Mybatis_demo
这篇博文通过简单的CRUD案例,让大家能够快速的上手,使用mybatis. 1,在eclipse中新建java project项目 mybatis_demo 2,在mybatis_demo项目中建 ...