Python 实现RMI

什么是RMI :远程方法调用,通过对象序列化,代理模式,在本地调用远程的方法或者和函数的方式,在JAVA或Python 中都有其具体的解决方式。

先看图 :

   看看方法调用是如何发生的 :借鉴Head First 设计模式中对RMI的实现方式。

  

  
 
 
 
 
 
 
 
基本的介绍也就这些了。
先看看使用JAVA 来制作远程服务
Step一:  制作远程接口
 
JAVA
1 import java.rmi.* ;
2 
3 //扩展JAVA.RMI.REMOTE接口
4 public interface MyRemote extends Remote {
5     //远程调用一定会抛出异常,RemoteException
6     //确定变量和返回值是属于原语(primitive)类型或者可序列化
7     //String 是可序列化类型
8     public String sayHello() throws RemoteException;
9 }

 

Step二: 制作远程实现,也就是说远程服务的实现

Remote Service
//UnicastRemoteObject 帮助我们实现了某些功能
public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{
    public String sayHello(){
        return "Server says ,'Hey!'";
    }
    //必须声明的空的构造函数,意味这你的构造器正在调用不安全的代码
    public MyRemoteImpl() throws RemoteException{}

    public static void main(String[] args){
        try{
            MyRemote service = new MyRemoteImpl();
            Naming.rebind("RemoteHello",service);

        }catch(Exception ex){
            ex.printStackTrace();
        }

    }
}

Step三: 产生Stub 和 Skeleton

其中S tub 是对象是客户端必须找到的对象

Step四: Stub 在RMI服务器端进行注册 使用RMI Register 进行注册

Step五:启动 远程服务,也就是在一个线程中启动Remote Service。

 

这样服务器端的所有准备工作完成。

再来看看客户端的代码是如何实现。

Step一:客户端在Register中寻找stub代理的代码

 

Step二:Register返回该Stub的对象

 

Step三:客户端就像调用真正的Stub 对象一样调用该段代码

 

Client
client :
import java.rmi.* 

public class MyRemoteClient(){
    public void main(string[] args){
        new MyRemoteClent.go();    

    }


    public void go(){
        MyRemote service=(MyRmote)Naming.lookup("rmi://127.0.0.1/RemoteHello");
        service.sayHello();
        
    }

} 

 

 

 

 

 

 

 
 
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Python实现的递归模型索引(Recursive Model Index,RMI)的代码示例: ```python import numpy as np from sklearn.linear_model import LinearRegression class RMI: def __init__(self, data, leaf_size=16, num_steps=10): self.leaf_size = leaf_size self.num_steps = num_steps self.buckets = [] self.models = [] self.build(data) def build(self, data): self.min_val = np.min(data) self.max_val = np.max(data) num_buckets = int(np.ceil(len(data) / self.leaf_size)) if num_buckets == 1: start = 0 end = len(data) bucket_data = data[start:end] bucket_min = np.min(bucket_data) bucket_max = np.max(bucket_data) self.buckets.append((bucket_min, bucket_max)) self.models.append(None) else: self.buckets.append((self.min_val, self.max_val)) self.models.append(None) bucket_data = [] for i in range(num_buckets): start = i * self.leaf_size end = min((i + 1) * self.leaf_size, len(data)) bucket_data.append(data[start:end]) new_data = [] for i in range(num_buckets): bucket_min = np.min(bucket_data[i]) bucket_max = np.max(bucket_data[i]) self.buckets.append((bucket_min, bucket_max)) bucket_values = (bucket_data[i] - bucket_min) / (bucket_max - bucket_min) x = np.linspace(0, 1, len(bucket_values)) model = LinearRegression() for j in range(self.num_steps): model.fit(x.reshape(-1, 1), bucket_values) y_pred = model.predict(x.reshape(-1, 1)) residuals = bucket_values - y_pred bucket_values = residuals self.models.append(model) new_data.append(y_pred) self.build(np.concatenate(new_data)) def predict(self, query): if query < self.min_val or query > self.max_val: return -1 bucket_idx = 0 while self.models[bucket_idx] is not None: bucket_min, bucket_max = self.buckets[bucket_idx] if query <= bucket_min: bucket_idx = 2 * bucket_idx + 1 elif query >= bucket_max: bucket_idx = 2 * bucket_idx + 2 else: x = np.array([(query - bucket_min) / (bucket_max - bucket_min)]) model = self.models[bucket_idx] for i in range(self.num_steps): y_pred = model.predict(x.reshape(-1, 1)) x -= y_pred bucket_idx = 2 * bucket_idx + 1 + np.argmax(x) leaf_idx = bucket_idx - len(self.models) bucket_min, bucket_max = self.buckets[bucket_idx] x = np.array([(query - bucket_min) / (bucket_max - bucket_min)]) model = self.models[bucket_idx] for i in range(self.num_steps): y_pred = model.predict(x.reshape(-1, 1)) x -= y_pred return leaf_idx * self.leaf_size + np.argmax(x) ``` 相较于RMI,递归模型索引(RMI)可以更好地处理数据分布不均的情况。这里使用了递归的方式构建索引结构,每个节点只有一个模型,如果当前节点的模型为None,则说明该节点是叶子节点,直接保存数据。查询时,从根节点开始递归查找,如果当前节点的模型为None,则说明该节点是叶子节点,根据数据分布计算得到查询值所在叶子节点的索引。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值