go 병행 프로 그래 밍 에 대한 총화

3211 단어 goroutinegolang
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 가 지 를 실행 합 니 다.
즉시
  • 만약 에 하나 이상 의 파이프 작업 이 완 료 될 수 있다 면 Go 가 실 행 될 때 시스템 은 무 작위 로 하 나 를 선택 하여 실행 합 니 다.그렇지 않 으 면 default 분기 가 있 으 면 default 분기 문 구 를 실행 합 니 다.default 도 없 으 면 selection 문 구 는 적어도 하나의 파이프 작업 이 실 행 될 때 까지 계속 막 힙 니 다.
  • 실제 goroutine 이 존재 해 야 합 니 다.파이프 작업 의 하위 goroutine 이 모두 종료 되면 select{}은 panic
  • 에 보고 합 니 다.
    부분 참조:https://www.jianshu.com/p/2a1...

    좋은 웹페이지 즐겨찾기