Go 是否可以发送函数作为RPC的响应

Go 是否可以发送函数作为RPC的响应,go,rpc,Go,Rpc,我正在尝试实现一个服务器和多个客户端。 客户机将在服务器上注册,服务器应该给客户机一个特定的函数来调用。 我不希望特定函数是另一个rpc调用。我正在尝试为MapReduce创建一个分布式系统,该功能将在客户端进程中执行 是否有一种方法可以传递函数作为对Go中远程过程调用的响应? 以下是我尝试过的: 在服务器中: type ResgisterResponse struct { Ack bool MapFunc func() } func (a *API) Register

我正在尝试实现一个服务器和多个客户端。 客户机将在服务器上注册,服务器应该给客户机一个特定的函数来调用。 我不希望特定函数是另一个rpc调用。我正在尝试为MapReduce创建一个分布式系统,该功能将在客户端进程中执行

是否有一种方法可以传递函数作为对Go中远程过程调用的响应? 以下是我尝试过的:

在服务器中:

type ResgisterResponse struct {
    Ack     bool
    MapFunc func()
}

func (a *API) RegisterWorker(addr string, reply *ResgisterResponse) error {
    a.worker[addr] = "idle" //idle, working, complete
    fmt.Printf("Wokers : %+v\n", a.worker)
    *reply = ResgisterResponse{
        Ack: true,
        MapFunc: func() {
            fmt.Println("Hello Worker")
        },
    }
    return nil
}
在客户中:

var reply struct {
        Ack     bool
        MapFunc func()
    }
err = client.Call("API.RegisterWorker", getLocalAddr()+":"+localPort, &reply)
must(err)
fmt.Println("Worker registered")
reply.MapFunc()
当然,我得到的是零指针错误

panic: runtime error: invalid memory address or nil pointer dereference

由于语言设计的原因,通过网络发送普通函数将不起作用。在单个程序中,您可以将函数作为参数传递,因为它们是在同一个二进制文件中编译的。在服务器进程中,您可以获取它们的地址/引用,因为它们映射在内存中,但当您发送函数时,实际上是向它发送指针,而该指针在客户端内存中不是有效地址(因此出现无效指针错误)

为了解决您的问题,我建议客户端根据id(可以是一个提及函数名的字符串)向服务器注册一组可用函数。服务器将在runrpc调用中发回函数id,客户端将根据该id选择函数并运行它


也有一些实验库可以在运行时评估GO代码,但我不认为它们是安全的。例如。

由于语言设计的原因,通过网络发送普通函数将不起作用。在单个程序中,您可以将函数作为参数传递,因为它们是在同一个二进制文件中编译的。在服务器进程中,您可以获取它们的地址/引用,因为它们映射在内存中,但当您发送函数时,实际上是向它发送指针,而该指针在客户端内存中不是有效地址(因此出现无效指针错误)

为了解决您的问题,我建议客户端根据id(可以是一个提及函数名的字符串)向服务器注册一组可用函数。服务器将在runrpc调用中发回函数id,客户端将根据该id选择函数并运行它


也有一些实验库可以在运行时评估GO代码,但我不认为它们是安全的。就是一个例子。

rpc的目的不是不调用客户端中的函数吗?是的,但在本例中,我尝试实现一个mapreduce网络。所以我希望工人们来做这项工作。服务器将充当主服务器,只是告诉工作人员该做什么。rpc的目的不是不在客户端调用该函数吗?是的,但在这种情况下,我尝试实现一个mapreduce网络。所以我希望工人们来做这项工作。服务器将充当主机,只是告诉工作人员该做什么。谢谢您的解释。我会让服务器发回函数id。但也许我不会事先在服务器上注册函数,而是使用Golang中的插件加载与id匹配的函数。我想这就解决了。谢谢你的解释。我会让服务器发回函数id。但也许我不会事先向服务器注册函数,而是使用Golang中的插件来加载与id匹配的函数。我认为这就解决了问题。