2016-05-24 8 views
0

mein Code funktioniert perfekt, bis ich es mit vielen gleichzeitigen Anrufen skalieren möchte. Es funktioniert, indem Sie dem Client eine Get-Anfrage stellen. DieseGolang, Nullzeiger Dereferenz oder ungültige Speicheradresse

ist das, was ich bekomme:

panic: runtime error: invalid memory address or nil pointer dereference 
[signal 0xb code=0x1 addr=0x0 pc=0x400da9] 

goroutine 125 [running]: 
runtime.panic(0x697480, 0x850d13) 
    /usr/lib/go/src/pkg/runtime/panic.c:279 +0xf5 
main.concurrent(0x25e5) 
    /home/maker/go/src/GoBot/GoBot.go:19 +0x1a9 
created by main.main 
    /home/maker/go/src/GoBot/GoBot.go:51 +0x224 

Ich glaube, ich bin nicht richtig die Fehlerbehandlung und wenn viele Anfragen zu machen stürzt.

func concurrent(n uint64) { 
    for i := n; i < n+11; i++ { 
      member, err := s.GetUser(i) 
      output <- fmt.Sprint(member.Username) //This is line 19 that triggers the error 
      if err != nil && member != nil { 
       continue 
      } 
    } 
defer wg.Done() 
} 

Wie kann ich das lösen? Referenzen für s.GetUser hier: https://github.com/njasm/gosoundcloud/blob/master/soundcloud.go#L274

+0

Sie verwenden 'member' in Zeile 19, auch wenn ein Fehler von' GetUser' zurückgegeben wird. Es scheint nicht mit Parallelität zu tun - vielleicht sehen Sie es jetzt nur, weil Ihre gleichzeitige Version mehr Aufrufe an "GetUser" macht. –

Antwort

1

Zum einen könnte man die Panik verhindern, indem sie den Rückgabewert von GetUser Überprüfung, die Sie gerade zu ignorieren;

 member, err := s.GetUser(i) 
     if err != nil { 
      // handle error 
     } 
     if member != nil { // prevents the panic attempting to access Username on nil instance of user/member 
      output <- fmt.Sprint(member.Username) //This is line 19 that triggers the error 
      if err != nil && member != nil { 
       continue 
      } 
     } 

Darüber hinaus was macht GetUser tun? Wenn es einen HTTP-GET macht, würde die Anwendung normalerweise blockieren, bis sie zurückkehrt, was bedeutet, dass die Chancen gut sind, wenn Sie Ihren Fehler überprüfen, wird es einen wie einen HTTP 404, 403, 500 ect geben.

Wenn der Aufruf von GetUser gleichzeitig war, dann könnte man in ein Problem laufen, wo der Code unten versucht, Zugriff auf den member.Username vor GetUser zurückgekehrt wodurch die nil Panik, aber ich sehe nicht, wie das passieren konnte, da Sie haben keine Goroutine dort. Es sollte nur ein einfacher blockierender Anruf sein. Wenn der obige Vorschlag Sie nicht zur Ursache Ihres Problems führt, dann bearbeiten Sie Ihre Frage mit den Ergebnissen von GetUser und es ist die Implementierung und ich werde weiter darauf eingehen.

+0

Eigentlich mache ich die Funktion zu Göroutinen. Gibt es einen besseren Weg, es zu tun, oder indem Sie es einfach überprüfen, sollte es es lösen? @evanmcdonnal – Juanvulcano

+0

@Juanvulcano Ich würde annehmen, dass Sie "gleichzeitig" in einer Go-Routine wie "Go Concurrent (10)" aufrufen, haben Sie keine goroutines in 'gleichzeitig 'so in diesem Bereich gibt es keine Nebenläufigkeit. Das heißt, nur die Überprüfung wird es wahrscheinlich für Sie tun, würde ich überrascht sein, wenn die Ursache nicht ein Fehler in GetUser ist – evanmcdonnal

+0

Ich benutze eine for-Schleife. https://play.golang.org/p/WyjoLFzCVW Mache ich es falsch? @evanmcdonnal – Juanvulcano

Verwandte Themen