TL; DR принимает и соединяет две отдельные SETS соединений. Хотите сделать это с RPC одновременно.Проблемы с Go Routines и его параллелизм
Я пытаюсь создать полураспределенную систему на своем компьютере. Часть кода, над которым я сейчас работаю, - это что-то вроде брокерского узла, другими словами, он всегда принимает клиентские соединения из порта. Он также постоянно принимает соединения на заднем конце узла из другого порта. Я пытаюсь найти способ одновременно слушать и то, и другое. Я использую RPC и способ, которым я пытался делать это так: Main:
func main(){
...
rpc.Register(myInterface)
l, err := net.Listen("tcp", client_port)
if err != nil {...}
go handleClients(l)
node_l, err := net.Listen("tcp", node_port)
if err != nil{...}
go setUpIncomingNodes(node_l, chan)
for{// add nodes to a list from chan}
}
Одновременные функции:
// Adds clients to be connected
func handleClients(listener net.Listener){
for{
conn, err :=listener.Accept()
if err != nil{...}
// Starts up a blocking (on that thread) RPC connection
go rpc.serveConn(conn)
}
}
func setUpIncomingNodes(node_listener net.Listener, incoming_nodes chan<- net.Conn){
for{
conn, err := node_listener.Accept()
if err != nil{...}
incoming_nodes <- conn
}
}
Вопрос заключается в том, что она служит не первый узел, пока вторая идет вперед. Я не понимаю, почему. Также кажется, что во времени может произойти только одно соединение, но я думал, что RPC обслуживается на другом порту (таким образом, не блокируя его). Любая помощь очень ценится.
Я пробовал следующее this tutorial, но я обнаружил, что это обстоятельство слишком отличается, его также использует другая версия Go. Я использую два типа узлов/соединений, где тип A должен быть подан через брокера типа B.
Если я не ошибаюсь, goroutine, как волокна, и выполняет какую-то совместную многозадачность. Мне кажется, что ваша текущая реализация блокирует себя. Надеюсь, что этот комментарий дает подсказку --- dunno семантики Go достаточно, чтобы рассказать больше на этом этапе. –
Вы правы: goroutines делают совместную многопоточность на абстрактном уровне над потоками ОС. Другими словами, каждый поток ОС может, по-видимому, одновременно запускать множество goroutines. Время выполнения Go делает это по времени - разрезает goroutines на поток. –
Спасибо за подтверждение. Затем я думаю, что вызов 'Accept' блокирует поток, поэтому все goroutines. Необходимо либо выполнить исполнение, либо изменить фактические потоки или каналы. –