es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Intenté hacer una prueba de referencia utilizando rpc y exec.command pero me quedé atascado en cmd.Run().

Estoy tratando de hacer una prueba de rendimiento con Go, usando rpc y exec.command. Aquí están partes de mi código. Tengo un maestro que envía rpc al trabajador para hacer algún trabajo.

func main() {
var wg sync.WaitGroup
var clients []*rpc.Client
client, err := rpc.DialHTTP(“tcp”, “addr”+”:1234″)
if err != nil {
log.Fatal(“dialing:”, err)
}
reply := &Reply{}
args := &Args{}
clients = append(clients, client)
fmt.Println(clients)
err = clients[0].Call(“Worker.Init”, args, reply)
if err != nil {
log.Fatal(“init error:”, err)
}
// llamada al servidor para inicializar el canal
// err = client.Call(“Worker.Init”, args, reply)
args.A = 1
wg.Add(200)
fmt.Println(time.Now().UnixNano())
for i := 0; i < 200; i++ {
go func() {
defer wg.Done()
err = client.Call(“Worker.DoJob”, args, reply)
if err != nil {
log.Fatal(“dojob error:”, err)
}
fmt.Println(“Done”)
}()
}
wg.Wait()
fmt.Println(time.Now().UnixNano())
}

y el código del trabajador
“`
func (w *Worker) DoJob(args *Args, reply *Reply) error {
// encontrar un canal para hacerlo
w.c <- 1
runtime.LockOSThread()
fmt.Println(“exec”)
// cmd := exec.Command(“docker”, “run”, “–rm”, “ubuntu:16.04”, “/bin/bash”, “-c”, “date +%s%N”)
cmd := exec.Command(“echo”, “hello”)
err := cmd.Run()
fmt.Println(“exec done”)
if err != nil {
reply.Err = err
fmt.Println(err)
}
fmt.Println(“done”)
<-w.c
return nil
}

Uso un canal de tamaño 12 para simular que la máquina solo tiene 12 hilos, y después de encontrar que se quedaba atascado en cmd.Run(), cambié el comando de ejecutar un docker a simplemente imprimir “hola”, pero todavía se queda atascado entre fmt.Println(“exec”) y fmt.Println(“exec done”). No sé por qué está sucediendo esto. ¿Estoy enviando demasiados rpcs y se están perdiendo muchos?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás intentando hacer una prueba de rendimiento con Go usando RPC y exec.command. Tienes un maestro para enviar RPC al trabajador y hacer algún trabajo. Estás usando un canal de tamaño 12 para simular que la máquina tiene solo 12 hilos. Sin embargo, tu código se queda atascado entre fmt.Println("exec") y fmt.Println("exec done").

    Es posible que estés enviando demasiados RPC y algunos de ellos se estén perdiendo. Es posible que desees considerar reducir el número de RPC que envías o aumentar el tamaño del canal.

Comments are closed.