Is there a recommended tutorial? 在 2019年3月1日星期五 UTC+8下午12:21:58,Robert Engels写道: > > I think it would be helpful if you learned more about concurrent > programming. It is 10x harder, even with the simplifications that Go > offers. If you don’t understand the concepts you are going to struggle. > Start with some tutorials and work your way up. > > On Feb 28, 2019, at 10:14 PM, mount...@gmail.com <javascript:> wrote: > > This is the stack information printed when blocking, how to see which G > blocking program? > > SIGABRT: abort > PC=0x7fff9ceabbf2 m=0 sigcode=0 > > goroutine 0 [idle]: > runtime.pthread_cond_wait(0x1967620, 0x19675e0, 0x7fff00000000) > /usr/local/go/src/runtime/sys_darwin.go:302 +0x51 > runtime.semasleep(0xffffffffffffffff, 0x7fff5fbff670) > /usr/local/go/src/runtime/os_darwin.go:63 +0x85 > runtime.notesleep(0x19673e0) > /usr/local/go/src/runtime/lock_sema.go:167 +0xe3 > runtime.stoplockedm() > /usr/local/go/src/runtime/proc.go:2165 +0x8a > runtime.schedule() > /usr/local/go/src/runtime/proc.go:2565 +0x2d9 > runtime.park_m(0xc000072480) > /usr/local/go/src/runtime/proc.go:2676 +0xae > runtime.mcall(0x105722b) > /usr/local/go/src/runtime/asm_amd64.s:299 +0x5b > > goroutine 1 [semacquire]: > sync.runtime_Semacquire(0xc000027794) > /usr/local/go/src/runtime/sema.go:56 +0x39 > sync.(*WaitGroup).Wait(0xc000027794) > /usr/local/go/src/sync/waitgroup.go:130 +0x64 > cmd/go/internal/work.(*Builder).Do(0xc00023b0e0, 0xc0003ee3c0) > /usr/local/go/src/cmd/go/internal/work/exec.go:174 +0x38e > cmd/go/internal/run.runRun(0x195c300, 0xc00001e0e0, 0x1, 0x1) > /usr/local/go/src/cmd/go/internal/run/run.go:137 +0x55b > main.main() > /usr/local/go/src/cmd/go/main.go:219 +0x7d4 > > goroutine 5 [syscall]: > os/signal.signal_recv(0x0) > /usr/local/go/src/runtime/sigqueue.go:139 +0x9f > os/signal.loop() > /usr/local/go/src/os/signal/signal_unix.go:23 +0x22 > created by os/signal.init.0 > /usr/local/go/src/os/signal/signal_unix.go:29 +0x41 > > goroutine 50 [select]: > cmd/go/internal/work.(*Builder).Do.func2(0xc000027794, 0xc00023b0e0, > 0xc0004b0620) > /usr/local/go/src/cmd/go/internal/work/exec.go:155 +0x12f > created by cmd/go/internal/work.(*Builder).Do > /usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a > > goroutine 51 [select]: > cmd/go/internal/work.(*Builder).Do.func2(0xc000027794, 0xc00023b0e0, > 0xc0004b0620) > /usr/local/go/src/cmd/go/internal/work/exec.go:155 +0x12f > created by cmd/go/internal/work.(*Builder).Do > /usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a > > goroutine 52 [syscall]: > syscall.Syscall6(0x7, 0x12006, 0xc000050c24, 0x0, 0xc0002f43f0, 0x0, 0x0, > 0xc0002f43f0, 0x0, 0xc0000e2400) > /usr/local/go/src/syscall/asm_darwin_amd64.s:41 +0x5 > syscall.wait4(0x12006, 0xc000050c24, 0x0, 0xc0002f43f0, 0x90, 0x1566d60, > 0x14cc401) > /usr/local/go/src/syscall/zsyscall_darwin_amd64.go:34 +0x7b > syscall.Wait4(0x12006, 0xc000050c74, 0x0, 0xc0002f43f0, 0x0, 0x1, 0x1) > /usr/local/go/src/syscall/syscall_bsd.go:129 +0x51 > os.(*Process).wait(0xc0002fd4a0, 0xc000034a00, 0xc000050cf8, 0x0) > /usr/local/go/src/os/exec_unix.go:38 +0x7b > os.(*Process).Wait(0xc0002fd4a0, 0x15b89c8, 0x15b89d0, 0x15b89c0) > /usr/local/go/src/os/exec.go:125 +0x2b > os/exec.(*Cmd).Wait(0xc00052da20, 0x0, 0x0) > /usr/local/go/src/os/exec/exec.go:465 +0x5b > os/exec.(*Cmd).Run(0xc00052da20, 0x50, 0xc0000df7c0) > /usr/local/go/src/os/exec/exec.go:309 +0x5c > cmd/go/internal/base.RunStdin(0xc0000df7c0, 0x1, 0x1) > /usr/local/go/src/cmd/go/internal/base/base.go:162 +0x11e > cmd/go/internal/run.buildRunProgram(0xc00023b0e0, 0xc0003ee3c0, 0x13999b3, > 0xc00023b150) > /usr/local/go/src/cmd/go/internal/run/run.go:151 +0x26d > cmd/go/internal/work.(*Builder).Do.func1(0xc0003ee3c0) > /usr/local/go/src/cmd/go/internal/work/exec.go:107 +0x72 > cmd/go/internal/work.(*Builder).Do.func2(0xc000027794, 0xc00023b0e0, > 0xc0004b0620) > /usr/local/go/src/cmd/go/internal/work/exec.go:165 +0xbb > created by cmd/go/internal/work.(*Builder).Do > /usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a > > goroutine 53 [select]: > cmd/go/internal/work.(*Builder).Do.func2(0xc000027794, 0xc00023b0e0, > 0xc0004b0620) > /usr/local/go/src/cmd/go/internal/work/exec.go:155 +0x12f > created by cmd/go/internal/work.(*Builder).Do > /usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a > > goroutine 24 [chan receive]: > cmd/go/internal/base.processSignals.func1(0xc000086f00) > /usr/local/go/src/cmd/go/internal/base/signal.go:21 +0x34 > created by cmd/go/internal/base.processSignals > /usr/local/go/src/cmd/go/internal/base/signal.go:20 +0x93 > > rax 0x104 > rbx 0xea00 > rcx 0x7fff5fbff488 > rdx 0xea00 > rdi 0x1967620 > rsi 0xea010000eb00 > rbp 0x7fff5fbff520 > rsp 0x7fff5fbff488 > r8 0x0 > r9 0x60 > r10 0x0 > r11 0x202 > r12 0x1967620 > r13 0x16 > r14 0x1 > r15 0x7fffa5c9d3c0 > rip 0x7fff9ceabbf2 > rflags 0x203 > cs 0x7 > fs 0x0 > gs 0x0 > > 在 2019年2月28日星期四 UTC+8下午8:44:55,Sameer Ajmani写道: >> >> The deadlock happens because the channel is empty, so the receive >> operation blocks forever. >> >> The second version imports a package that may start new goroutines in its >> init functions. If so, those goroutines may not be deadlocked, but the main >> function is still blocked on the receive operation. >> >> It can be useful to send SIGQUIT to a blocked Go program to dump the >> goroutine stack traces to the terminal. >> >> S >> >> On Thu, Feb 28, 2019 at 4:19 AM <mount...@gmail.com> wrote: >> >>> dead lock: >>> >>> package main >>> >>> import ( >>> "fmt" >>> // _ "github.com/go-sql-driver/mysql" >>> ) >>> >>> func main() { >>> c1 := make(chan int, 10) >>> fmt.Println(<-c1) >>> } >>> >>> >>> block: >>> >>> package main >>> >>> import ( >>> "fmt" >>> >>> _ "github.com/go-sql-driver/mysql" >>> ) >>> >>> func main() { >>> c1 := make(chan int, 10) >>> fmt.Println(<-c1) >>> } >>> >>> -- >>> 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...@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...@googlegroups.com <javascript:>. > 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.