10
votes

We have a API server written in go that is based on gin-gonic. We've noticed something odd that has led us to believe that it is processing requests serially rather than the expected parallel operation. Consider this log file:

[GIN] 2016/04/05 - 17:24:37 | 200 |    5.738742ms | 64.... |   POST    /api/v2/d/
[GIN] 2016/04/05 - 17:24:40 | 200 |  3.262816256s | 64.... |   POST    /api/v2/d/
[GIN] 2016/04/05 - 17:24:42 | 200 |    3.563779ms | 64.... |   POST    /api/v2/d/
[GIN] 2016/04/05 - 17:24:43 | 200 |     105.429µs | 64.... |   POST    /api/v2/d/
[GIN] 2016/04/05 - 17:24:43 | 200 |     808.824µs | 64.... |   POST    /api/v2/d/

Watching the log in real time, the last 3 entries are not displayed until the second call finishes. These five calls are made to the API within 5 milliseconds of each other. We expect that the calls should be processed in parallel. This implies that all the calls should complete by 17:24:40, not 17:24:43. IE: That the server spawns a new thread/goroutine when the connection is made to process the request. If that is not the case does anyone have any suggestions for a package that does work that way.

This is our first project with gin-gonic and I'm wondering if there is some configuration parameter that needs to be set. Any ideas/suggestions are appreciated.

1
What version of Go are you using?John Weldon
@JohnWeldon I am using 1.6mlewis54
So assuming you have more than one logical CPU, you could potentially see parallelism, but it's not guaranteed. Goroutines provide concurrency, not necessarily parallelism.John Weldon

1 Answers

3
votes

To answer your root question; The stdlib http.Serve (doc) func farms the request out to a goroutine after the initial connection accept and some connection work.

Conceptual Rambling:

Go has primitives that are designed to provide strong concurrency capability, but concurrency is not the same as parallelism.

If you have more than one processor core, and if your GOMAXPROCS environment is set to be more than 1, then you may see some parallelism in addition to concurrency, assuming the appropriate goroutines.

As of Go 1.5 the default setting for GOMAXPROCS is the number of CPU cores. Prior versions of Go default the GOMAXPROCS setting to 1.

William Kennedy had a good write up about the differences a couple years ago: http://www.goinggo.net/2014/01/concurrency-goroutines-and-gomaxprocs.html