基于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实现延迟任务. 一.延迟任务的使用场景 ...
随机推荐
- vm中的nat模式不能连接到主机,以及不能上网
主机能够ping通vm中的ip,但是vm不能ping通主机ip vm不能ping通主机:主要是虚拟机中的gateway的设置和vm的网络编辑器中的网关id不一致造成的 vm不能上外网:dns没有配置正 ...
- 怎么把Thu Nov 22 2018 10:49:36 GMT+0800转换成正常日期
this.data //Thu Nov 22 2018 10:49:36 GMT+0800 this.date_of_birth = date.getFullYear() + '-' + (date. ...
- 使用特性将数据库返回的datatable转换成对象列表
public class ColumnMapAttribute : Attribute { private readonly string _name; public ColumnMapAttribu ...
- asp.net(c#)网页跳转 方法小结
返回 打印 asp.net(c#)网页跳转七种方法小结_实用技巧_脚本之家 在asp.net下,经常需要页面的跳转,下面是具体的几种方法.跳转页面是大部编辑语言中都会有的,正面我们来分别介绍一下关于. ...
- Java 新建excle文件并填充模版内容
Java 新建excle文件并填充模版内容 一.JAR import java.io.BufferedReader; import java.io.File; import java.io.FileI ...
- 多线程threading 的使用
在Python3中,通过threading模块提供线程的功能.原来的thread模块已废弃.但是threading模块中有个Thread类(大写的T,类名),是模块中最主要的线程类,一定要分清楚了,千 ...
- 依据word模板批量生成试卷
java-word-MassProduction 目录 使用方法 开发流程 一.使用方法 1.制造题库所需Word模板 需要填充数据的地方使用 ${pid} 代替. 将这个word选择另存为,保存格式 ...
- FL Studio中的音频设置
在FL Studio中,有一步很关键的设置需要我们详细熟悉了解,它就是音频设置,什么是音频设置呢?它就是需要我们选择音频设备驱动程序并优化设置.在了解音频设备之前,我们先来看看什么是音频设备. 我们的 ...
- 使用guava过期map
最近需要将微信的accesstoken保存到缓存里面,防止重复请求微信接口获取token,造成token请求次数超标,其实随便一个缓存都可以轻松解决,但是现有的环境中没有redis,没有memcahe ...
- Codeforces Round #503 (by SIS, Div. 2)
连接:http://codeforces.com/contest/1020 C.Elections 题型:你们说水题就水题吧...我没有做出来...get到了新的思路,不虚.好像还有用三分做的? KN ...