как реализовать неблокирующий клиент в grpc go? - PullRequest
0 голосов
/ 13 февраля 2019

Я хочу запустить разные удаленные процедуры на разных серверах, не дожидаясь ответа от сервера.и как сервер завершает процедуру, я хочу получить ответ на клиенте.Можно ли это сделать с grpc golang?

Я хочу реализовать сеть блокчейна, и я хочу попросить разные узлы выполнить транзакцию, но я не хочу ждать, пока один узел предоставит вывод выполнения, а затем я перейду к другому узлу.

Другими словами, я хочу передать выполнение процедуры, а затем получить все ответы по мере выполнения.

Я попробовал общие методы для соединения клиента и сервера, но он ожидает ответа отсервер.это увеличит время, когда выполнение должно быть выполнено на большем количестве пиров.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Просто сделайте так, чтобы Client-Streaming в gRPC Client отправлял сообщение снова и снова, когда он отправляет все данные

 // 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
 }()

0 голосов
/ 13 февраля 2019

Вы можете использовать

go func(){}()

для выполнения асинхронных заданий, и вы можете легко управлять асинхронными задачами с помощью встроенного пакета синхронизации или использовать каналы для управления или синхронизации с ним задач.

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

https://gobyexample.com/channels

...