亚欧色一区w666天堂,色情一区二区三区免费看,少妇特黄A片一区二区三区,亚洲人成网站999久久久综合,国产av熟女一区二区三区

  • 發布文章
  • 消息中心
點贊
收藏
評論
分享
原創

Golang使用Channel實現并發控制

2024-11-14 09:41:52
29
0

Golang中Channel簡介

Go語言中的channel是一種核心的并發控制結構,它允許在不同的goroutine之間同步和傳遞數據。以下是channel的一些基本特性:

  1. channel是一種類型,可以用于在goroutine之間傳遞數據。
  2. 通過make函數創建channel,例如ch := make(chan string)創建了一個用于傳遞字符串的channel
  3. channel有三種基本操作:發送、接收和關閉,發送操作使用ch <- x,接收操作使用x := <-ch<-ch
  4. channel分為有緩沖和無緩沖兩種。無緩沖channel在讀寫過程中都會阻塞,直到發送和接收操作都準備好。有緩沖channel在緩沖區滿時寫操作會阻塞,空時讀操作會阻塞。無緩沖channel是同步的,發送和接收操作必須同時準備好。有緩沖channel是異步的,寫操作在緩沖區未滿時直接返回,讀操作在緩沖區不空時進行。
  5. channel可以被關閉,關閉后不能再進行發送操作,但可以繼續進行接收操作直到緩沖區的數據被讀完。
  6. channel的容量是make函數中指定的緩沖區大小,長度是當前緩沖區中的數據數量。
  7. channel可能會導致循環阻塞或協程泄漏,需要特別注意使用方法以防止死鎖和協程泄漏的產生。

Golang使用Channel實現并發控制

代碼demo

package main
 ?
 import (
     "fmt"
     "sync"
     "time"
 )
 ?
 // 定義協程池
 type ThreadPool struct {
     ch chan int
 }
 ?
 // 創建協程池,含最大并發量參數
 func NewThreadPool(maxCoroutines int) *ThreadPool {
     return &ThreadPool{
         ch: make(chan int, maxCoroutines),
     }
 }
 ?
 // 從協程池獲取協程,以處理任務
 func (tp *ThreadPool) Get() {
     tp.ch <- 1
 }
 ?
 // 任務完成后,歸還協程至協程池
 func (tp *ThreadPool) Put() {
     <-tp.ch
 }
 ?
 func main() {
 ?
     maxCoroutines := 5
     tp := NewThreadPool(maxCoroutines)
 ?
     wg := sync.WaitGroup{}
     for i := 0; i < 50; i++ {
         tp.Get()
         wg.Add(1)
         go func(i int) {
             defer func() {
                 wg.Done()
                 tp.Put()
             }()
             time.Sleep(100 * time.Microsecond)
             fmt.Println("idx ", i)
         }(i)
     }
     wg.Wait()
     fmt.Println("finish")
 }

代碼解讀

  1. 使用帶緩沖的channel實現最大并發量的控制。
    1. 通過NewThreadPool(maxCoroutines int)創建最大并發量為maxCoroutines 的協程池。
    2. 協程池的Get()方法,向帶緩沖的channel中寫入數據,作用是獲取空閑協程池來處理任務; 若chnanel已滿則阻塞,實現最大并發量控制。
    3. 協程池的Put()方法,從帶緩沖的channel中獲取數據,作用是釋放資源池,增加新的可用協程。
  2. 使用sync.WaitGroup等待所有任務結束。
    1. 任務開始時使用sync.WaitGroup.Add(1)方法增加任務計數。
    2. 任務結束時使用sync.WaitGroup.Done()方法減少任務計數,減少1。
    3. 最后使用sync.WaitGroup.Wait()方法等待所有任務完成。
0條評論
0 / 1000
魏****明
1文章數
0粉絲數
魏****明
1 文章 | 0 粉絲
魏****明
1文章數
0粉絲數
魏****明
1 文章 | 0 粉絲
原創

Golang使用Channel實現并發控制

2024-11-14 09:41:52
29
0

Golang中Channel簡介

Go語言中的channel是一種核心的并發控制結構,它允許在不同的goroutine之間同步和傳遞數據。以下是channel的一些基本特性:

  1. channel是一種類型,可以用于在goroutine之間傳遞數據。
  2. 通過make函數創建channel,例如ch := make(chan string)創建了一個用于傳遞字符串的channel
  3. channel有三種基本操作:發送、接收和關閉,發送操作使用ch <- x,接收操作使用x := <-ch<-ch
  4. channel分為有緩沖和無緩沖兩種。無緩沖channel在讀寫過程中都會阻塞,直到發送和接收操作都準備好。有緩沖channel在緩沖區滿時寫操作會阻塞,空時讀操作會阻塞。無緩沖channel是同步的,發送和接收操作必須同時準備好。有緩沖channel是異步的,寫操作在緩沖區未滿時直接返回,讀操作在緩沖區不空時進行。
  5. channel可以被關閉,關閉后不能再進行發送操作,但可以繼續進行接收操作直到緩沖區的數據被讀完。
  6. channel的容量是make函數中指定的緩沖區大小,長度是當前緩沖區中的數據數量。
  7. channel可能會導致循環阻塞或協程泄漏,需要特別注意使用方法以防止死鎖和協程泄漏的產生。

Golang使用Channel實現并發控制

代碼demo

package main
 ?
 import (
     "fmt"
     "sync"
     "time"
 )
 ?
 // 定義協程池
 type ThreadPool struct {
     ch chan int
 }
 ?
 // 創建協程池,含最大并發量參數
 func NewThreadPool(maxCoroutines int) *ThreadPool {
     return &ThreadPool{
         ch: make(chan int, maxCoroutines),
     }
 }
 ?
 // 從協程池獲取協程,以處理任務
 func (tp *ThreadPool) Get() {
     tp.ch <- 1
 }
 ?
 // 任務完成后,歸還協程至協程池
 func (tp *ThreadPool) Put() {
     <-tp.ch
 }
 ?
 func main() {
 ?
     maxCoroutines := 5
     tp := NewThreadPool(maxCoroutines)
 ?
     wg := sync.WaitGroup{}
     for i := 0; i < 50; i++ {
         tp.Get()
         wg.Add(1)
         go func(i int) {
             defer func() {
                 wg.Done()
                 tp.Put()
             }()
             time.Sleep(100 * time.Microsecond)
             fmt.Println("idx ", i)
         }(i)
     }
     wg.Wait()
     fmt.Println("finish")
 }

代碼解讀

  1. 使用帶緩沖的channel實現最大并發量的控制。
    1. 通過NewThreadPool(maxCoroutines int)創建最大并發量為maxCoroutines 的協程池。
    2. 協程池的Get()方法,向帶緩沖的channel中寫入數據,作用是獲取空閑協程池來處理任務; 若chnanel已滿則阻塞,實現最大并發量控制。
    3. 協程池的Put()方法,從帶緩沖的channel中獲取數據,作用是釋放資源池,增加新的可用協程。
  2. 使用sync.WaitGroup等待所有任務結束。
    1. 任務開始時使用sync.WaitGroup.Add(1)方法增加任務計數。
    2. 任務結束時使用sync.WaitGroup.Done()方法減少任務計數,減少1。
    3. 最后使用sync.WaitGroup.Wait()方法等待所有任務完成。
文章來自個人專欄
文章 | 訂閱
0條評論
0 / 1000
請輸入你的評論
0
0