I agree. I’ve read the arguments against thread-local (or goroutine local 
storage), and the passing of Context everywhere instead. It doesn’t make sense 
to me.

Even a simple runtime.GetGoID() that returned a unique int would allow the 
design of much simpler server software.

But I don’t think it is going to change, so get to know ‘refactor method 
signature in IntelliJ’ really well.

> On Oct 29, 2018, at 10:28 PM, Tang Shiwei <siweitang...@gmail.com> wrote:
> 
> 
> 
> Now i have the same problem as you, i need to record log id through a web 
> request, and pass the log id by httpContext, its look orderless for my code, 
> so sad!
> 
> 
> On Thursday, February 25, 2016 at 1:59:11 AM UTC+8, Damian Turczyński wrote:
> Kevin
> 
> I have in my opinion valid reason. I'm writing a web server in go. I want to 
> have logs across all application to include requestID. The only way I can do 
> that is to pass httpContext everywhere! Which is hilarious, and super 
> unclean. In other languages/frameworks it is possible as you have something 
> like HttpContext accessible globally, and yet of course you have to deal with 
> spawning child threads with care and maybe even to pass httpContext there but 
> it's much smaller hustle than passing httpContext in every single function 
> I'll write in my application.
> 
> On Sunday, October 14, 2012 at 1:36:25 PM UTC+1, Kevin Gillette wrote:
> That should be fine, but in this case, it'd be better to refer to it as 'task 
> specific' instead of 'goroutine local', since your struct isn't/shouldn't be 
> designed around the assumption that it's goroutine local.
> 
> The big issue with stuff not being freed is when a map of goroutine id to 
> data is used (if the goroutine exits without deleting its data from the map, 
> a leak has occurred), not to mention that there are _extremely_ few, if any 
> (I'm strongly edging towards there being none) legitimate reasons to store 
> data based on goroutine Id -- that kind of thinking is generally a carryover 
> for languages that are much less effective at handling concurrency.
> 
> On Saturday, October 13, 2012 9:12:40 AM UTC-6, bryanturley wrote:
> 
> On Sat, Oct 13, 2012 at 8:54 AM, bryanturley <bryan...@gmail.com <>> wrote:
> What I do when i need something like this is
> 
> type LilSrv struct {
>   // bleh
>   // your goroutine local stuff here nicely predefined
>   // some chans to talk to it
> }
> 
> func (ls *LilSrv) MLoop() {
>   for {
>   // bleh, stuff
>   }
> }
> 
> ...  somewhere in your code
> 
> ls = new(LilSrv) // or similar 
> go ls.MLoop()  // normally i have this wrapped in something like "NewLilSrv() 
> (ls *LilSrv)"
> 
> now that ls is your goroutine local storage without using c code or any other 
> way to low level for normal use code.
> 
> 
> Are you saying the ls in my example won't get GC'ed when it isn't in use 
> anymore?
> What I exampled here is done throughout the standard library...  for instance 
> inside http://golang.org/src/pkg/net/http/server.go?s=30567:30613#L1015 
> <http://golang.org/src/pkg/net/http/server.go?s=30567:30613#L1015>
> c, e := newConn()  few lines later
> go c.serve()  
> I think my phrasing just confused you.
> The entire idea of this was to make it not a global state, just a struct that 
> got allocated before the goroutine started that was explicit to that 
> goroutine and others that need to talk to it.
> And if a new goroutine is started in ls.MLoop it doesn't necessarily even 
> matter if it can see that ls.
> 
> The real problem was a single global name that lived in a new spot 
> automagically each thread, that is clearly not happening here.
> 
> 
> On Thursday, February 25, 2016 at 1:59:11 AM UTC+8, Damian Turczyński wrote:
> Kevin
> 
> I have in my opinion valid reason. I'm writing a web server in go. I want to 
> have logs across all application to include requestID. The only way I can do 
> that is to pass httpContext everywhere! Which is hilarious, and super 
> unclean. In other languages/frameworks it is possible as you have something 
> like HttpContext accessible globally, and yet of course you have to deal with 
> spawning child threads with care and maybe even to pass httpContext there but 
> it's much smaller hustle than passing httpContext in every single function 
> I'll write in my application.
> 
> On Sunday, October 14, 2012 at 1:36:25 PM UTC+1, Kevin Gillette wrote:
> That should be fine, but in this case, it'd be better to refer to it as 'task 
> specific' instead of 'goroutine local', since your struct isn't/shouldn't be 
> designed around the assumption that it's goroutine local.
> 
> The big issue with stuff not being freed is when a map of goroutine id to 
> data is used (if the goroutine exits without deleting its data from the map, 
> a leak has occurred), not to mention that there are _extremely_ few, if any 
> (I'm strongly edging towards there being none) legitimate reasons to store 
> data based on goroutine Id -- that kind of thinking is generally a carryover 
> for languages that are much less effective at handling concurrency.
> 
> On Saturday, October 13, 2012 9:12:40 AM UTC-6, bryanturley wrote:
> 
> On Sat, Oct 13, 2012 at 8:54 AM, bryanturley <bryan...@gmail.com <>> wrote:
> What I do when i need something like this is
> 
> type LilSrv struct {
>   // bleh
>   // your goroutine local stuff here nicely predefined
>   // some chans to talk to it
> }
> 
> func (ls *LilSrv) MLoop() {
>   for {
>   // bleh, stuff
>   }
> }
> 
> ...  somewhere in your code
> 
> ls = new(LilSrv) // or similar 
> go ls.MLoop()  // normally i have this wrapped in something like "NewLilSrv() 
> (ls *LilSrv)"
> 
> now that ls is your goroutine local storage without using c code or any other 
> way to low level for normal use code.
> 
> 
> Are you saying the ls in my example won't get GC'ed when it isn't in use 
> anymore?
> What I exampled here is done throughout the standard library...  for instance 
> inside http://golang.org/src/pkg/net/http/server.go?s=30567:30613#L1015 
> <http://golang.org/src/pkg/net/http/server.go?s=30567:30613#L1015>
> c, e := newConn()  few lines later
> go c.serve()  
> I think my phrasing just confused you.
> The entire idea of this was to make it not a global state, just a struct that 
> got allocated before the goroutine started that was explicit to that 
> goroutine and others that need to talk to it.
> And if a new goroutine is started in ls.MLoop it doesn't necessarily even 
> matter if it can see that ls.
> 
> The real problem was a single global name that lived in a new spot 
> automagically each thread, that is clearly not happening here.
> 
> 
> -- 
> 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 
> <mailto:golang-nuts+unsubscr...@googlegroups.com>.
> For more options, visit https://groups.google.com/d/optout 
> <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