The ultra-short and precise answer to this question is: multithreading.

Go implements a multithreaded runtime which maps goroutines to threads in
an N:M style. The idea is to obtain the efficiency of a libev model without
limiting yourself to a single core. The hard part is to manage the mapping
of goroutines to cores. I know of two posts which gives an excellent
overview:

Daniel Morsing's blog: https://morsmachine.dk/index

And a couple of posts by Jaana Burcu Doğan (@rakyll):
https://rakyll.org/scheduler/

Daniel's post is getting old, so suggest reading Jaana first, although I
still believe both are correct nowadays.

Compared to the Node.js approach, the solution Go uses poses some distinct
advantages, namely:

* More than one CPU core can work on the same program at the same time.
This improves parallelism.
* Programs can be written in a direct style, rather than as a set of event
callbacks.
* Scheduling can be pre-emptive rather than cooperative which can improve
program correctness and/or program processing latency to be more fair.

The primary disadvantage of the Go approach is that explicit control over
the schedule is given over to the runtime. For smaller systems, you may be
able to handle this better yourself with a cooperative scheduler, albeit
for larger systems, this is extremely hard. The reason is that you need
only a single library import which is badly written and all of your system
is in jeopardy, whereas the pre-emptive Go scheduler will avoid such a
problem. Also, since Node.js programs only runs on a single core, the
system might need less locking around "shared" datastructures, which allows
some programs to run faster on a single core, given some specific workload
and luck in having everything fit on the single core's cache etc.

I think, for modern architectures, that the Go approach is the correct one,
and that anything based on something like libev is eventually going to be
forgotten as a failed approach. But I've been known to be wrong on some
cases :)

On Mon, Jan 22, 2018 at 9:32 PM Peng Yu <pengyu...@gmail.com> wrote:

> Hi, I'd like to know what go concurrency is based on. For example, nodejs
> is based on libev, making nodejs more efficient than using multithreading
> to handle concurrency. What is go based on to make go concurrency more
> effecient than multithreading?
> --
> Regards,
> Peng
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to