Goroutines are user space threads that are lighter and faster to create than kernel-space threads. The go scheduler assigns goroutines into run queues by the scheduler. Each kernel has access to a (local) run queue. If a goroutines takes too long to run (usually 10ms) it will be assigned to the global run queue - this is known as cooperative pre-emption.