[go語言]select多路選擇的類比實現

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。有時候有這樣一種應用情境:需要等待多個事件到達,然後返回儘可能多的事件;如果沒有事件到達就阻塞等待。例如伺服器等待用戶端建立串連,或者等待用戶端資料等就有這種應用需求。在go語言裡,可以利用select原語和它的非阻塞(default)分支組合實現這個功能:
// 從ch擷取儘可能多的資料放到events裡,並返回實際數量;如果沒有資料就阻塞等待func wait(ch chan int, events []int) int {    count := 0    for count < len(events) {        select {        case x := <-ch:            events[count] = x            count++        default:            if count > 0 {                return count            }            events[count] = <-ch            count++        }    }    return count}
如果再加上退出檢查:
import "errors"func wait(ch chan int, exit chan bool, events []int) (int, error) {    count := 0    for count < len(events) {        select {        case <-exit:            return 0, errors.New("exit")        case x := <-ch:            events[count] = x            count++        default:            if count > 0 {                return count, nil            }            select {            case <-exit:                return 0, errors.New("exit")            case x := <-ch:                events[count] = x                count++            }        }    }    return count, nil}
可以看到,這裡的實現有很多重複代碼,非常的冗長難讀。我們可以利用channel以下特性改寫一下:1.讀取或者寫入空channel時永久阻塞2.讀取一個已經關閉的channel立即返回空值
import "errors"var (CLOSED = make(chan int))func init() {close(CLOSED)}func pass(flag bool) chan int {if flag {return CLOSED}return nil}func wait(ch chan int, exit chan bool, events []int) (int, error) {count := 0LOOP:for count < len(events) {select {case <-exit:return 0, errors.New("exit")case x := <-ch:events[count] = xcount++case <-pass(count > 0):break LOOP}}return count, nil}
現在的實現就比較清晰簡潔易讀。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.