我來自一個Node.js背景,其超級容易做一些異步工作,然後做一些更多的工作,在長時間運行的任務完成,我敢肯定它在Go中是一樣的,但我只是沒有我的腦袋裏圍繞着頻道如何工作。我是否在golang中使用了不正確的頻道?
我正在構建一箇舊遊戲的解析器,我玩的是從拍賣數據日誌中分析線路,並將它們解析爲通過套接字io流到網站上的實時饋送。一個文件一次可以發送100行,而我的解析器必須一次一行地分析每行,並從每行中提取元信息(例如項目,項目價格等)。
每條單一行都有for循環針對它運行(假定其中的項目列表已經從正則表達式得到的部分):
itemChannel := make(chan Item)
for _, itemName := range itemList {
item := Item {
Name: itemName,
}
// Long running method which does parsing for the item such as pricing, quantity and makes some http calls (runs 75ms on average)
go item.FetchData(itemChannel)
// Read from the channel when its done
raw := <-itemChannel
auction.Items = append(auction.Items, raw)
auction.Seller = seller
}
auctions = append(auctions, auction)
fmt.Println("Appended auction: ", auction)
go c.publishToRelayService(auction)
現在(從觀察中),它好像raw := <-itemChannel
導致循環阻塞,直到夠程完成並通過它的數據返回(這肯定意味着運行,因爲item.FetchData(itemChannel)
會做同樣的事情。我怎樣才能從通道讀取數據回來,但儘可能快地跳出循環迭代。行中有15-20項,導致程序在解析下一行之前暫停〜2-3秒。我希望能夠儘快解決和處理下一行,以儘可能快地保持解析器。是否有任何類似Promise in Node的機制,我可以將完成處理程序鏈接到每個完成的item.FetchData()
?
注意fetchChannel
被寫入我的項目類型的內部,當所有提取工作已完成。
你可以放一個可運行的代碼去玩嗎?它會更好地理解這個問題 –
嘿我其實只是通過給我的FetchData方法添加一個回調函數來解決這個問題。因此,總結渠道阻塞,如果是的話,爲什麼我們使用它們?對於分佈在不同系統中的相同程序的IPC,它更多嗎? – Alex
是通道阻塞,除非它被緩衝。 –