<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Stream 是一個基於 Go 1.18+ 泛型的流式處理庫, 它支援並行處理流中的資料. 並行流會將元素平均劃分多個的分割區, 並建立相同數量的 goroutine 執行, 並且會保證處理完成後流中元素保持原始順序.
GitHub - xyctruth/stream: A Stream library based on Go 1.18+ Generics (Support Parallel Stream)
需要安裝 Go 1.18+ 版本
$ go get github.com/xyctruth/stream
在程式碼中匯入它
import "github.com/xyctruth/stream"
s := stream.NewSliceByOrdered([]string{"d", "a", "b", "c", "a"}). Filter(func(s string) bool { return s != "b" }). Map(func(s string) string { return "class_" + s }). Sort(). Distinct(). ToSlice() // 需要轉換切片元素的型別 s := stream.NewSliceByMapping[int, string, string]([]int{1, 2, 3, 4, 5}). Filter(func(v int) bool { return v >3 }). Map(func(v int) string { return "mapping_" + strconv.Itoa(v) }). Reduce(func(r string, v string) string { return r + v })
any
接受任何型別的元素, 所以不能使用 ==
!=
>
<
比較元素, 導致你不能使用 Sort(), Find()...等函數 ,但是你可以使用 SortFunc(fn), FindFunc(fn)... 代替
type SliceStream[E any] struct { slice []E } stream.NewSlice([]int{1, 2, 3, 7, 1})
comparable
接收的型別可以使用 ==
!=
比較元素, 但仍然不能使用 >
<
比較元素, 因此你不能使用 Sort(), Min()...等函數 ,但是你可以使用 SortFunc(fn), MinFunc()... 代替
type SliceComparableStream[E comparable] struct { SliceStream[E] } stream.NewSliceByComparable([]int{1, 2, 3, 7, 1})
constraints.Ordered
接收的型別可以使用 ==
!=
>
<
, 所以可以使用所有的函數
type SliceOrderedStream[E constraints.Ordered] struct { SliceComparableStream[E] } stream.NewSliceByOrdered([]int{1, 2, 3, 7, 1})
有些時候我們需要使用 Map
,Reduce
轉換切片元素的型別,但是很遺憾目前 Golang 並不支援結構體的方法有額外的型別引數,所有型別引數必須在結構體中宣告。在 Golang 支援之前我們暫時使用臨時方案解決這個問題。
// SliceMappingStream Need to convert the type of slice elements. // - E elements type // - MapE map elements type // - ReduceE reduce elements type type SliceMappingStream[E any, MapE any, ReduceE any] struct { SliceStream[E] } s := stream.NewSliceByMapping[int, string, string]([]int{1, 2, 3, 4, 5}). Filter(func(v int) bool { return v >3 }). Map(func(v int) string { return "mapping_" + strconv.Itoa(v) }). Reduce(func(r string, v string) string { return r + v })
Parallel
函數接收一個 goroutines int
引數. 如果 goroutines>1 則開啟並行, 否則關閉並行, 預設流是關閉並行的。
並行會將流中的元素平均劃分多個的分割區, 並建立相同數量的 goroutine 執行, 並且會保證處理完成後流中元素保持原始順序.
s := stream.NewSliceByOrdered([]string{"d", "a", "b", "c", "a"}). Parallel(10). Filter(func(s string) bool { // 一些耗時操作 return s != "b" }). Map(func(s string) string { // 一些耗時操作 return "class_" + s }). ForEach( func(index int, s string) { // 一些耗時操作 }, ).ToSlice()
First
: 一旦獲得第一個返回值,並行處理就結束. For: AllMatch, AnyMatch, FindFuncALL
: 所有元素都需要並行處理,得到所有返回值,然後並行結束. For: Map, FilterAction
: 所有元素需要並行處理,不需要返回值. For: ForEach, Action開啟並行 goroutine 數量在面對 CPU 操作與 IO 操作有著不同的選擇。
一般面對 CPU 操作時 goroutine 數量不需要設定大於 CPU 核心數,而 IO 操作時 goroutine 數量可以設定遠遠大於 CPU 核心數.
NewSlice(s).Parallel(goroutines).ForEach(func(i int, v int) { sort.Ints(newArray(1000)) // 模擬 CPU 耗時操作 })
使用6個cpu核心進行基準測試
go test -run=^$ -benchtime=5s -cpu=6 -bench=^BenchmarkParallelByCPU goarch: amd64 pkg: github.com/xyctruth/stream cpu: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz BenchmarkParallelByCPU/no_parallel(0)-6 717 9183119 ns/op BenchmarkParallelByCPU/goroutines(2)-6 1396 4303113 ns/op BenchmarkParallelByCPU/goroutines(4)-6 2539 2388197 ns/op BenchmarkParallelByCPU/goroutines(6)-6 2932 2159407 ns/op BenchmarkParallelByCPU/goroutines(8)-6 2334 2577405 ns/op BenchmarkParallelByCPU/goroutines(10)-6 2649 2352926 ns/op
NewSlice(s).Parallel(goroutines).ForEach(func(i int, v int) { time.Sleep(time.Millisecond) // 模擬 IO 耗時操作 })
使用6個cpu核心進行基準測試
go test -run=^$ -benchtime=5s -cpu=6 -bench=^BenchmarkParallelByIO goos: darwin goarch: amd64 pkg: github.com/xyctruth/stream cpu: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz BenchmarkParallelByIO/no_parallel(0)-6 52 102023558 ns/op BenchmarkParallelByIO/goroutines(2)-6 100 55807303 ns/op BenchmarkParallelByIO/goroutines(4)-6 214 27868725 ns/op BenchmarkParallelByIO/goroutines(6)-6 315 18925789 ns/op BenchmarkParallelByIO/goroutines(8)-6 411 14439700 ns/op BenchmarkParallelByIO/goroutines(10)-6 537 11164758 ns/op BenchmarkParallelByIO/goroutines(50)-6 2629 2310602 ns/op BenchmarkParallelByIO/goroutines(100)-6 5094 1221887 ns/op
專案地址 https://github.com/xyctruth/stream
以上就是Go1.18新特性使用Generics泛型進行流式處理的詳細內容,更多關於Go1.18 Generics泛型流式處理的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45