On Monday, November 21, 2016 at 2:23:37 PM UTC-5, zhaoguo wang wrote:
>
> Hi all,
>
> I wrote a simple application: the main function creates two goroutines, 
> while these two goroutines use RPC to do simple communication continually. 
>
> I found 
> *if the main function falls into a busy loop after creating the two 
> goroutines, *
> *the whole application will hang up after sending/receiving a couple 
> number of RPCs* (~80 on my testbed).
>
> Can anyone illustrate why this happens?  As each goroutine uses 
> independent Linux threads, why one spins can affect others?
>
>
Threads are independent, but there's still a single runtime scheduler. IIRC 
the busy loop is preventing the GC from being able to stop the world, which 
in turn ends up blocking the scheduler. 

 

> I use *runtime.GOMAXPROCS(4)* to make sure each goroutine uses a 
> Linux thread and the testbed is ubuntu 14.04 with 8 CPU cores. 
> I use the go1.7.3  library which is compiled from the source code. I also 
> attach the source code of the simple test, you should be 
> able to run it with "go run test.go".
>


Just never use a busy loop. A busy loop is always an error, and there's no 
reason to use 100% of a CPU just to block the main goroutine. You can use a 
WaitGroup, channel receive, or even an empty select statement to block 
efficiently if you want. 
 

 

-- 
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