I agree with all of those assessments. That’s why I think the “context” needs 
to be moved into a language construct. Then the developer is insulated from 
most (all) of these problems - that is the “current context” propagates unless 
specifically told not to when creating the Go routine. In almost all cases the 
context is a single reference so it should be cheap to propagate.

If the “context” was a higher level standardized concept, then the “values” 
could be typed, so all of the benefits of the Java way - transactions, logging, 
“current user”, etc. can all be addressed in a type-safe manner.

I’ve stated a few times that a Go routines lack of context (name, purpose, etc) 
is a huge problem. It really limits the ability to write very high performance 
applications (pinning routines to cores, groups of routines to CPU’s, marking 
some routines as “delay GC”, etc.).

> On Jan 16, 2019, at 3:33 PM, Ian Lance Taylor <i...@golang.org> wrote:
> 
>> On Wed, Jan 16, 2019 at 7:15 AM Robert Engels <reng...@ix.netcom.com> wrote:
>> 
>> 
>> I don’t see the complexity nor the real difference between Go routines and 
>> Threads. In Java TLS is not passed to new threads you need to be explicit. 
>> The ThreadLocal doesn’t allow  access to other threads locals even with 
>> thread groups, etc. As far as I understand Go has no concept of parent Go 
>> routine - at least not exposed - so I don’t see the issue.
> 
> The difference is that in Java creating a new thread is a relatively
> heavyweight operation.  It's not hard, but it's not routine.  It's
> reasonable that when creating a new thread you consider how to handle
> any thread local variables.  In particular everybody understands that
> the new thread will not have access to any of the thread local
> variables of the parent thread.
> 
> In Go new goroutines are started frequently and casually.  For
> example, it's routine for people to change a loop computing a list of
> values into a loop that starts a goroutine for each computation.  If
> we are using a thread-local context.Context to cancel a goroutine,
> then one would naturally expect all those goroutines to inherit that
> Context value, so that they too will be stopped.  If they don't
> inherit it, then we need some extra mechanism to set the thread-local
> Context, and we need to remember to do that.  If they do inherit it,
> then we need to think about the cases where they shouldn't inherit it.
> Either way, the operation is sometimes implicit and sometimes
> explicit.  That is confusing.
> 
> In Java it's not confusing to always make thread-local handling
> explicit.  In Go that would be frustrating and awkward.
> 
> 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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to