如何在grpc go中实现非阻塞客户端?

时间:2019-02-13 04:24:39

标签: go blockchain p2p grpc

我想在不同的服务器上运行不同的远程过程,而不必等待服务器的答复。作为服务器完成了我想在客户端进行回复的过程。可以用grpc golang吗?

我想实现一个区块链网络,我想要求不同的对等方执行交易,但是我不想等到一个对等方提供执行输出,然后再转到另一对等方。

换句话说,我要广播过程的执行,然后在执行完成时获得所有答案。

我尝试了连接客户端和服务器的常用方法,但是它等待服务器的响应。它将增加需要在更多对等节点上执行的时间。

2 个答案:

答案 0 :(得分:0)

您可以使用

go func(){}()

执行异步作业,您可以使用内置的同步包轻松控制异步任务 或使用渠道来控制或同步任务。

https://golang.org/pkg/sync/

https://gobyexample.com/channels

答案 1 :(得分:0)

只需在gRPC中进行客户端流式传输 客户在发送所有数据时一次又一次地发送消息

 // add stream keyword when use in client side streaming
 rpc HeavyLoadData(stream P2PMessages) returns (P2PMessages);

如果需要连续性,也可以使用双向

message P2PMessages{
    string anything = 1;
}

rpc Messages(stream P2PMessages) returns (stream P2PMessages){};

如果您想做一些必须完成的事情,然后再发送数据,请使用锁

var lock = &sync.RWMutex{}

// it will lock until your logic completes 
fun test(){
lock.RLock()
defer lock.RUnlock()
//do something your logic
}

如果有多个客户端组成一个客户端,并且希望在完成逻辑使用后发送数据,也可以使用

首先创建客户端地图

var clients = make(map[string]string)

//then use the threading in go 
 go func(){
 // maintain here all your client when you want to send the data to whom
 }()