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)
}()
}
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
}
閱讀論文以了解詳細信息、組合器等。
TA貢獻1864條經驗 獲得超6個贊
有很多方法可以做到這一點,但我所做的就是調整 NewPromise() 以將函數作為接受結果和錯誤通道的參數。然后 NewPromise 方法用這個函數初始化一個 go 例程,返回具有相同通道的承諾以供讀取。如果你調用 .Then 方法,這基本上需要兩個函數作為參數。一種處理您通過結果通道(字符串)傳遞的類型,另一種處理錯誤通道的結果類型(錯誤)。.Then 方法然后調用 goroutine 中的私有 .then() 方法來選擇首先發生的結果或錯誤,然后調用適合每個結果的函數。
例如,我只使用了一個簡單的自動收報機,它等待一秒鐘,然后通過結果通道發送“hi”。
我希望這能讓您了解一種方法來做到這一點。
GoLang 游樂場:https : //play.golang.org/p/xc1xvv7hRx
- 3 回答
- 0 關注
- 354 瀏覽
添加回答
舉報
