Why an Infinite-Loop Goroutine Blocks a Go HTTP Server
Despite setting the number of maximum available threads to 8, starting an infinite-loop goroutine causes the HTTP server to block after a few invocations. This behavior contradicts the assumption that independent threads would prevent blocking.
Explanation:
The Go runtime's scheduler operates in a non-fully pre-emptive manner. While it periodically invokes the scheduler during function calls, an infinite loop without these calls prevents the scheduler from being triggered. This non-preemptive behavior causes the infinite-loop goroutine to consume all available threads, leaving none for the HTTP server.
runtime.LockOSThread()
Adding runtime.LockOSThread() to the infinite loop should have forced its execution on a single thread, isolating it from the HTTP server. However, it fails to resolve the issue.
According to the Go documentation for runtime.LockOSThread(), the targeted empty loop should run in a separate thread, allowing other goroutines to execute concurrently. However, it seems that the empty loop in the example is not sufficiently busy to trigger the thread separation.
Solution:
To address this issue, you can either use a loop with some actual execution logic or manually call runtime.Gosched() within the loop. This will trigger the scheduler and allow other goroutines, including the HTTP server, to resume execution.
The above is the detailed content of Why Does an Infinite Loop Goroutine Block a Go HTTP Server Even with Thread Limits?. For more information, please follow other related articles on the PHP Chinese website!