多執行緒 多協程快速排序

2021-10-02 19:16:59 字數 1517 閱讀 7045

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的存在,無法真正意義上的實現多執行緒,但這種 不完美的多執行緒 依然可以大大提高爬蟲效率,當然在提高爬蟲效率方面還有大家所熟知的協程。比較官方的介紹我就不說了,畢竟瞅了一眼一大串,這...