package main
import
("fmt"
"sync"
"time"
)//分割演算法1
func
partition1
(arr [
]int
, low, high int
)int
arr[low]
= arr[high]
//將小的往前覆蓋,第乙個覆蓋的是樞紐資料
for low < high && arr[low]
<= t
arr[high]
= arr[low]
//將大的往後覆蓋
} arr[high]
= t //將樞紐資料覆蓋回去
return low
}//分割演算法2
func
partition2
(arr [
]int
, low, high int
)int
} arr[y]
, arr[low]
= arr[low]
, arr[y]
fmt.
println
(arr, y)
return y
}//多協程版本
func
syncquitsort
(arr [
]int
, low, high int
) mid :=
partition2
(arr, low, high)
var w sync.waitgroup
w.add(2
)gofunc()
()gofunc()
()w.wait()
}//單程序實現版本
func
quitsort
(arr [
]int
, low, high int
) mid :=
partition2
(arr, low, high)
quitsort
(arr, low, mid-1)
quitsort
(arr, mid+
1, high)
}func
main()
star := time.
now(
)syncquitsort
(arr,0,
len(arr)-1
) end := time.
since
(star)
fmt.
printf
("sync st:%v\n"
, end)
fmt.
println
("sort:"
, arr)
}
這裡是乙個協程不停的派生出新的協程,這裡協程數量沒有限制。優化的乙個點可以對協程數量限制,當協程數量超過cpu*2個就採用同步的方式。 協程的多執行緒切換
我們知道,在乙個基於協程的應用程式中,可能會產生數以千記的協程,所有這些協程,會有乙個的排程器來統一排程。另外我們知道,高效能的程式首要注意的就是避免程式阻塞。那麼,在以協程為最小執行單位的程式中,同樣也需要確保這一點,即每乙個協程都不能發生阻塞。因為只要某乙個協程發生了阻塞,那麼整個排程器就阻塞住...
協程的多執行緒切換
我們知道,在乙個基於協程的應用程式中,可能會產生數以千記的協程,所有這些協程,會有乙個的排程器來統一排程。另外我們知道,高效能的程式首要注意的就是避免程式阻塞。那麼,在以協程為最小執行單位的程式中,同樣也需要確保這一點,即每乙個協程都不能發生阻塞。因為只要某乙個協程發生了阻塞,那麼整個排程器就阻塞住...
多執行緒與協程爬蟲
網路爬蟲是一種高io密集型任務,所以傳統的程序或者多程序並不適合網路爬蟲。雖然由於cpython中全域性直譯器鎖gil的存在,無法真正意義上的實現多執行緒,但這種 不完美的多執行緒 依然可以大大提高爬蟲效率,當然在提高爬蟲效率方面還有大家所熟知的協程。比較官方的介紹我就不說了,畢竟瞅了一眼一大串,這...