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

我正在尝试实现一个服务器和多个客户端。客户端将向服务器注册,服务器应为客户端提供要调用的特定功能。我不希望特定函数是另一个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


FFIVE
浏览 226回答 1
1回答

四季花海

由于语言设计,通过网络发送普通函数将不起作用。在单个程序中,您可以将函数作为参数传递,因为它们是在同一二进制文件中编译的。在服务器进程中,您可以获取它们的地址/引用,因为它们映射在内存中,但是当您发送函数时,您实际上会发送指向它的指针,该指针在客户端的内存中不是有效的地址(因此指针错误无效)。为了解决您的问题,我会让客户端根据id(可能是提及函数名称的字符串)向服务器注册一组可用函数。服务器将在 Run RPC 调用中发回函数 ID,客户端将根据此 ID 选择函数并运行它还有一些实验库可以在运行时评估Go代码,但我认为它们不安全。这是一个例子。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go