go 병행 프로 그래 밍 에 대한 총화
1.sync 를 사용 하여 동시 다발:
package main
import (
"fmt"
"sync"
)
func main() {
testSlice := []string{"test1", "test2", "test3"}
wg := sync.WaitGroup{}
for _, t := range testSlice {
wg.Add(1)
go printSlice(t, &wg)
}
wg.Wait()
}
func printSlice(s string, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("this is %+v
", s)
}
sync 패키지 가 병발 을 실현 하 는 핵심 은 waitgroup 입 니 다.WaitGroup 형식의 지침 을 초기 화하 고 병발 이 필요 할 때 Add 방법 을 사용 하여 계 수 를 추가 하고 병발 이 필요 한 함수 에 매개 변수 로 입력 합 니 다.이 함수 작업 이 완료 되면 Done 방법 으로 계 수 를 줄 입 니 다.주 협 정 에서 Wait 방법 은 계수기 의 수량 을 계속 감청 합 니 다.계수기 가 0 일 때 모든 병발 함수 가 완성 되 었 음 을 설명 합 니 다.이때 주 협 정 은 탈퇴 할 수 있 습 니 다.개인 적 으로 이것 은 가장 간단 한 병발 방식 이 라 고 생각 합 니 다.한 집합 안의 모든 데 이 터 를 동시에 처리 해 야 할 때 특히 좋 습 니 다.
2.파 이 프 를 이용 하여 병발
파 이 프 는 go 원생 이 지원 하 는 데이터 형식 으로 사용 해도 동시 다발 효 과 를 얻 을 수 있 습 니 다.일반적인 사 고 는 주 협 정 에서 파이프 의 데 이 터 를 추출 하 는 것 입 니 다.이때 파 이 프 는 막 히 고 협 정 에서 파이프 에 데 이 터 를 넣 고 데 이 터 를 넣 은 후에 파 이 프 를 닫 습 니 다.주 협 정 에서 데 이 터 를 얻 지 못 하고 파이프 도 닫 힌 후에 임 무 를 완성 했다.
package main
import "fmt"
var channel = make(chan int, 10)
func main() {
go func() {
for i := 0; i < 10; i++ {
channel
위의 예 는 사실 병발 집행 을 나타 내지 않 았 다.왜냐하면 10 개의 수 를 순서대로 파이프 에 넣 었 기 때문에 주 협 정 은 순서대로 파이프 에서 데 이 터 를 꺼 냈 고 직렬 과정 이기 때문이다.
진급 판
package main
import (
"fmt"
)
var channel = make(chan int)
var result = make(chan int)
func main() {
go func() {
for i := 0; i < 100; i++ {
channel
데 이 터 를 순서대로 파이프 에 투입 한 후 파 이 프 를 옮 겨 다 니 며 데 이 터 를 꺼 낼 때마다 새로운 협 정 을 열 어 계산 작업(i+i)을 한 다음 결 과 를 result 대기 열 에 넣 고 마지막 으로 주 협 정 에서 result 파이프 의 값 을 꺼 냅 니 다.result 파 이 프 를 닫 아야 하지만 닫 힌 위치 가 확실 하지 않 습 니 다.현재 계 산 된 데이터 양 에 따라 순환 시 기 를 결정 하고 있 습 니 다.result 파 이 프 를 언제 닫 아야 할 지 논의 할 수 있 습 니 다.
주의 하 세 요.관 로 를 닫 는 것 과 감청 관 의 수 치 는 두 개의 서로 다른 협 정 이 필요 합 니 다.만약 에 두 작업 이 모두 하나의 협 정 에 있 거나 이미 닫 힌 협 정 을 감청 하거나 닫 히 지 않 은 협 정 을 감청 하면 이상 이 발생 할 수 있 습 니 다.
여기 서 파이프 의 용량 은 0 이다.즉,매번 파이프 에 데 이 터 를 넣 을 때마다 안의 데이터 가 소 비 된 후에 야 계속 막 을 수 있다.용량 이 있 는 협 정 은 수량 이 용량 인 데 이 터 를 넣 을 수 있 고 그 후의 데 이 터 는 여유 가 있 을 때 까지 막 아야 한다.
3.키워드 선택
코드 먼저 보기
start := time.Now()
c := make(chan interface{})
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
time.Sleep(4*time.Second)
close(c)
}()
go func() {
time.Sleep(3*time.Second)
ch1
현재 시간 이 3s 가 되 지 않 았 기 때문에 상기 코드 를 실행 합 니 다.그래서 현재 프로그램 은 default 으로 갑 니 다.
설명 이 default,ch1,ch2 가 지 를 무 작위 로 선택 하여 실행 합 니 다.ch1 ch2 의 sleep 시간 을 10 초 로 바 꾸 면 c 가 지 를 실행 합 니 다.
즉시
부분 참조:https://www.jianshu.com/p/2a1...
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Go - Goroutine 정리따라서 Golang 기반의 서버에서는 요청 1건 당 1개의 고루틴을 생성 하도록 만들 수 있지만, 요청 1건 당 1개의 쓰레드를 할당하는 다른 언어 기반의 서버는 앞선 방식으로 쓰이게 되면 결국에는 OOM(OutOf...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.