One of the critical decisions in Go was not defining names for goroutines.
If we give threads/goroutines/coroutines (TGCs) names or other identifiable
state, such as contexts, there arises a tendency to push everything into
one TGC. We see what this causes with the graphics thread in most modern
graphics libraries, especially when using a threading-capable language such
as Go. You are restricted in what you can do on that thread, or you need to
do some sort of bottlenecking dance to have the full language available and
still honoring the requirements of a single graphics thread.

One way to see see what this means: Long ago, people talked of a "thread
per request"  model, and honestly it was, or would have been, an
improvement on standard practice at the time. But if you have cheap TGCs,
there is no need to stop there: You can use multiple independently
executing TGCs to handle a request, or share a TGC between requests for
some part of the work (think database access, for example). You have *the
whole language available to you* when programming a request, including the
ability to use TGCs.

Like Ian, I have not read this paper, but I take it as a tenet that it is
better to keep goroutines anonymous and state-free, and not to bind any
particular calculation or data set to one thread of control *as part of the
programming model*. If you want to do that, sure, go for it, but it's far
too restrictive to demand it *a priori* and force it on others*.*

-rob



On Sat, Oct 1, 2022 at 1:39 PM Ian Lance Taylor <i...@golang.org> wrote:

> On Fri, Sep 30, 2022 at 7:32 AM Robert Engels <reng...@ix.netcom.com>
> wrote:
> >
> > Very interesting article came out recently.
> https://www.infoq.com/articles/java-virtual-threads/ and it has
> implications for the Go context discussion and the author makes a very good
> case as to why using the thread local to hold the context - rather than
> coloring every method in the chain is a better approach. If the “virtual
> thread aka Go routine” is extremely cheap to create you are far better off
> creating one per request than pooling - in fact pooling becomes an anti
> pattern. If you are creating one per request then the thread/routine
> becomes the context that is required. No need for a distinct Context to be
> passed to every method.
>
> I didn't read the article (sorry).
>
> In a network server a Go context is normally specific to, and shared
> by, a group of goroutines acting on behalf of a single request.  It is
> also normal for a goroutine group to manage access to some resource,
> in which case the context is passed in via a channel when invoking
> some action on behalf of some request.  Neither pattern is a natural
> fit for a goroutine-local context.
>
> Ian
>
> --
> 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.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/CAOyqgcWAfdc2Np2KA%2B2-U9Z5Hv7tdHGgJHWDTUg_6pbr%3D8jghg%40mail.gmail.com
> .
>

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAOXNBZRTgLSos4CXjHRV6zgu-8eLjxn2mYHjo%3DXMmw-Td4gz6g%40mail.gmail.com.

Reply via email to