【发布时间】:2021-02-21 09:37:49
【问题描述】:
我正在尝试实现一个服务器和多个客户端。 客户端将向服务器注册,服务器应该给客户端一个特定的函数来调用。 我不希望特定函数成为另一个 rpc 调用。我正在尝试为 map reduce 构建一个分布式系统,该系统将在客户端进程中执行该函数。
有没有办法将函数作为响应传递给 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
【问题讨论】:
-
rpc的意义不就是不调用客户端中的函数吗?
-
是的,但在这种情况下,我正在尝试实现一个 mapreduce 网络。所以我希望工人做这项工作。服务器将充当主人,只是告诉工人该做什么。