【Golang】第三方信号量库
【Golang】第三方信号量
基因Golang的基础学习,直到创建Web应用程序的学习已经完成,所以我将进行复习并总结。从基础到应用。
package main
/*
Semaphore
並列処理
インストール 済
https://godoc.org/golang.org/x/sync/semaphore
go get "golang.org/x/sync/semaphore"
*/
import (
"context"
"fmt"
"time"
"golang.org/x/sync/semaphore"
)
//2
//ここがセマフォ
//semaphoreで同時に走らせる数指定 == 1 開始する数
var s *semaphore.Weighted = semaphore.NewWeighted(1)
//3
func longProcess(ctx context.Context) {
//3-2 キャンセル
//goroutinを検証
//1つならTrue
//2つならFalse
isAcquire := s.TryAcquire(1)
//待っているgoroutinがあったら、キャンセル
//2つ以上走っていたら、キャンセルする
if !isAcquire {
//ロックされていない
fmt.Println("ロックされていない")
return
}
//3-1 ロック 待つ
/*
//errがnilでなければ
//err := s.Acquire(ctx, 1); でロックする
//このプロセスが終わったらリリースする。この間、他のgoroutinは待っている
//一つずつしか走らせることができない
if err := s.Acquire(ctx, 1); err != nil{
//出力して終了する
fmt.Println(err)
return
}
*/
//1つずつ処理
defer s.Release(1)
fmt.Println("Wait...")
time.Sleep(1 * time.Second)
fmt.Println("Done")
}
func main() {
//処理未定義 TODO部に設定できる事はまた調査する
ctx := context.TODO()
//並列処理
//3つのgoroutin
go longProcess(ctx)
go longProcess(ctx)
go longProcess(ctx)
time.Sleep(5 * time.Second)
}