亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Go 中使用 Channels 實現 Promise

在 Go 中使用 Channels 實現 Promise

Go
米脂 2021-12-20 16:41:10
我正在嘗試在 Go 中實現與 Javascript 中的 Promise 類似的 Promise。type Promise struct {        Result chan string        Error  chan error}func NewPromise() (*Promise) {        r := make(chan string, 1)        e := make(chan error, 1)        return &Promise{                Result: r,                Error:  e,        }}func main() {        var p = NewPromise()        go func(p *Promise) {                time.Sleep(time.Duration(5)*time.Second)                p.Result <- "done"        }(p)        if <- p.Result {                fmt.Println(<-p.Result)        }        // Is it possible to do something else here while wait for 5s?        // Once Promise is fulfilled after 5s, the Result is available.}我如何執行以下操作:運行一個 goroutine,它會立即返回Promise主 goroutine。在主程序上異步做一些事情,同時等待任何東西被發送到Promise.Result或者Promise.Error一旦發送了一些東西,從 goroutine 返回并使該通道可供讀取。
查看完整描述

3 回答

?
九州編程

TA貢獻1785條經驗 獲得超4個贊

一種不使用通道的不同方法,這使它更快/更高效:


type Promise struct {

    wg  sync.WaitGroup

    res string

    err error

}


func NewPromise(f func() (string, error)) *Promise {

    p := &Promise{}

    p.wg.Add(1)

    go func() {

        p.res, p.err = f()

        p.wg.Done()

    }()

    return p

}


func (p *Promise) Then(r func(string), e func(error)) {

    go func() {

        p.wg.Wait()

        if p.err != nil {

            e(p.err)

            return

        }

        r(p.res)

    }()

}


查看完整回答
反對 回復 2021-12-20
?
慕容森

TA貢獻1853條經驗 獲得超18個贊

Martin Sulzmann發表了一篇名為“From Events to Futures and Promises and back”的論文(發表于 2016 年 2 月),其中涵蓋了該主題。摘要說:


基于通道通信和期貨/承諾的事件是強大的,但對于并發編程來說似乎是不同的概念。我們表明,一個概念可以用令人驚訝的很少努力用另一個概念來表達。我們的結果提供了基于輕量級庫的方法來實現事件和期貨/承諾。實證結果表明,我們的方法在實踐中效果很好。


根據該論文,期貨看起來像這樣:


type Comp struct {

    value interface{}

    ok    bool

}


type Future chan Comp


func future(f func() (interface{}, bool)) Future {

    future := make(chan Comp)


    go func() {

        v, o := f()

        c := Comp{v, o}

        for {

            future <- c

        }

    }()


    return future

}

而 promises 的實現方式如下:


type Promise struct {

    lock chan int

    ft   Future

    full bool

}


func promise() Promise {

    return Promise{make(chan int, 1), make(chan Comp), false}

}


func (pr Promise) future() Future {

    return pr.ft

}

閱讀論文以了解詳細信息、組合器等。


查看完整回答
反對 回復 2021-12-20
?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

有很多方法可以做到這一點,但我所做的就是調整 NewPromise() 以將函數作為接受結果和錯誤通道的參數。然后 NewPromise 方法用這個函數初始化一個 go 例程,返回具有相同通道的承諾以供讀取。如果你調用 .Then 方法,這基本上需要兩個函數作為參數。一種處理您通過結果通道(字符串)傳遞的類型,另一種處理錯誤通道的結果類型(錯誤)。.Then 方法然后調用 goroutine 中的私有 .then() 方法來選擇首先發生的結果或錯誤,然后調用適合每個結果的函數。

例如,我只使用了一個簡單的自動收報機,它等待一秒鐘,然后通過結果通道發送“hi”。

我希望這能讓您了解一種方法來做到這一點。

GoLang 游樂場:https : //play.golang.org/p/xc1xvv7hRx


查看完整回答
反對 回復 2021-12-20
  • 3 回答
  • 0 關注
  • 354 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號