全部產品
Search
文件中心

Alibaba Cloud SDK:非同步呼叫

更新時間:Jul 01, 2024

開啟非同步呼叫

Alibaba Cloud SDK for Go 支援兩種方式開啟非同步呼叫: 註:開啟非同步呼叫之後需要先調用 Shutdown() 才能再次開啟非同步呼叫。

  1. 初始化 client 的時候開啟非同步呼叫

    import (
        "github.com/aliyun/alibaba-cloud-sdk-go/sdk"
        "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
        "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
    )
    
    c := sdk.NewConfig()
    c.EnableAsync = true // 非同步任務開關
    c.GoRoutinePoolSize = 10 // 開啟的協程數
    c.MaxTaskQueueSize = 20 // 單個協程的最大任務數
    c.Timeout = 10 * time.Second
    credential := credentials.NewAccessKeyCredential("acesskeyid", "accesskeysecret")
    client, err := ecs.NewClientWithOptions("regionid", c, credential)
  2. 調用 EnableAsync 的時候開啟非同步呼叫

    // 第一個入參為開啟的協程數
    // 第二個入參為單個協程的最大任務數
    // EnableAsync 只允許調用一次, 除非使用 Shutdown() 方法先關閉非同步呼叫,再調用 EnableAsync
    client.EnableAsync(10, 20)

發起非同步呼叫

Alibaba Cloud SDK for Go 支援兩種方式的非同步呼叫:

  1. 使用channel作為傳回值

    responseChannel, errChannel := client.FooWithChan(request)
    
    // this will block
    response := <-responseChannel
    err = <-errChannel
  2. 使用 callback 控制回調

    blocker := client.FooWithCallback(request, func(response *FooResponse, err error) {
        // handle the response and err
    })
    
    // blocker 為(chan int),用於控制同步,返回1為成功,0為失敗
    // 在<-blocker返回失敗時,err依然會被傳入的callback處理
    result := <-blocker

關閉非同步呼叫

通過調用 client 的執行個體方法關閉非同步呼叫並且關閉對應的協程

client.Shutdown()