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

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

使用 gorun 結束 (幣安) Web 服務流使用 go 例程

使用 gorun 結束 (幣安) Web 服務流使用 go 例程

Go
慕婉清6462132 2022-09-12 15:43:52
我正在將幣安API集成到現有系統中,雖然大多數部分都是直截了當的,但數據流API擊中了我對go-routines的有限理解。我不認為幣安的golang SDK中有什么特別之處,但本質上我只需要兩個函數,一個函數啟動數據流并使用作為參數給出的事件處理程序處理事件,另一個函數結束數據流而不會實際關閉客戶端,因為它將關閉所有其他連接。在之前的一個項目中,有兩種消息類型,但幣安 SDK 使用一個實現,該實現返回兩個 go 通道,一個用于錯誤,另一個用于停止數據 stram,我猜從名稱中可以。我為啟動數據流編寫的代碼如下所示:func startDataStream(symbol, interval string, wsKlineHandler futures.WsKlineHandler, errHandler futures.ErrHandler) (err error){    doneC, stopC, err := futures.WsKlineServe(symbol, interval, wsKlineHandler, errHandler)    if err != nil {        fmt.Println(err)        return err    }    return nil}這按預期工作并流式傳輸數據。一個簡單的測試來驗證它:func runWSDataTest() {    symbol := "BTCUSDT"    interval := "15m"    errHandler := func(err error) {fmt.Println(err)}    wsKlineHandler := func(event *futures.WsKlineEvent) {fmt.Println(event)}    _ = startDataStream(symbol, interval, wsKlineHandler, errHandler)}對我來說不太清楚的事情,主要是由于不完全理解,真的是我如何停止流。我認為返回的 stopC 通道可用于以某種方式發出類似于系統級 sigterm 的結束單句,然后流應該結束。比如說,我有一個停止數據流函數,它采用一個符號作為參數func stopDataStream(symbol){}
查看完整描述

2 回答

?
尚方寶劍之說

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

假設我為五個交易品種啟動 5 個數據流,現在我只想停止其中一個流。這就引出了一個問題:

  1. 如何跟蹤所有這些止損通道?

  2. 我是否可以使用帶有符號鍵控的集合,拉動 stopC 通道,然后發出信號來結束該數據流?

  3. 如何從停止函數實際寫入 stopC 通道?

同樣,我不認為這特別困難,只是我無法從文檔中弄清楚,所以任何幫助將不勝感激。

謝謝


查看完整回答
反對 回復 2022-09-12
?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

事實證明,只需保存&關閉頻道即可解決所有問題。我真的很驚訝這是多么容易,但這是更新函數的代碼:


func startDataStream(symbol, interval string, wsKlineHandler futures.WsKlineHandler, errHandler futures.ErrHandler) (err error) {


    _, stopC, err := futures.WsKlineServe(symbol, interval, wsKlineHandler, errHandler)

    if err != nil {

        fmt.Println(err)

        return err

    }

    // just save the stop channel 

    chanMap[symbol] = stopC

    return nil

}

然后,停止函數真的變得令人尷尬:


func stopDataStream(symbol string) {

    stopC := chanMap[symbol]  // load the stop channel for the symbol

    close(stopC) // just close it. 

}

最后,測試一下:



var (

    chanMap map[string]chan struct{}

)


func runWSDataTest() {

    chanMap = make(map[string]chan struct{})


    symbol := "BTCUSDT"

    interval := "15m"

    errHandler := func(err error) { fmt.Println(err) }

    wsKlineHandler := getKLineHandler()


    println("Start stream")

    _ = startDataStream(symbol, interval, wsKlineHandler, errHandler)


    time.Sleep(3 * time.Second)


    println("Stop stream")

    stopDataStream(symbol)


    time.Sleep(1 * time.Second)

}


就是這樣。


查看完整回答
反對 回復 2022-09-12
  • 2 回答
  • 0 關注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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