Go語言中協程的概念和基本使用

Go協程(Goroutine)是與其餘函數同時運行的函數。能夠認爲Go協程是輕量級的線程。與建立線程相比,建立Go協程的成本很小。所以在Go中同時運行上千個協程是很常見的。編程

一、 Go語言的併發性

        Go語言原生就支持了高併發操做,這一優秀基因在目前主流的編程語言中是比較少見的,Go語言的高併發性主要是經過 Go協程(Goroutine)來實現的。併發

        協程的特色async

  • 協程是一個輕量級的線程,此處能夠與進程、線程、協程 進行對比
  • Go協程是非搶佔式多任務處理,須要由協程主動交出控制權
  • 協程是一個 虛擬機層面的多任務處理
  • 多個協程可能運行在一個或者多個線程上

Go語言實現協程,只須要在函數前添加 go 關鍵字,就可使此函數併發執行編程語言

示例代碼以下:函數

package main

import (
	"fmt"
	"time"
)

func main() {
	for i := 0; i < 1000; i++ {
		
		go func(i int) {
			for {
				fmt.Printf("Hello from "+"goroutine %d\n", i)
			}
		}(i)
	}
	time.Sleep(time.Millisecond)
}

 

二、其餘語言中的協程

        C++ 能夠經過 Boost.Coroutine 庫實現協程。高併發

        Java 不支持協程spa

        Python 3.5  加入了 async def 對協程的支持,可是Python的 協程是在方法定義時就肯定了,被定義協程的方法不能當作普通方法來使用,而Go語言中定義方法和協程調用是分開的,任意方法加上go 關鍵字均可以進行協程併發操做,實現瞭解耦合。線程

 

三、Go語言協程調度器

        Go語言中全部的協程都經過調度器進行調度,大併發下成百上千甚至幾千的協程調用 經過調度器安排到不一樣的線程中執行。code

        調度的切換協程

        調度器會在什麼時候的時間點進行協程之間的切換,經過切換能夠將計算資源分配給其餘協程而不至於被一個協程鎖死資源,主要的切換點以下:

  •         IO/SELECT
  •         channel
  •         函數調用
  •         runtime.Gosched()  手動切換
  •         等待鎖
相關文章
相關標籤/搜索