Node.js 백그라운드에서 비동기식 작업을 수행하기 쉽고 장기 실행 작업을 완료하면 더 많은 작업을 수행 할 수 있으며 그 작업은 Go에서 동일하지만 확실하지는 않습니다. 채널이 어떻게 작동하는지에 대해 머리를 감쌌다.golang에 채널을 잘못 사용하고 있습니까?
나는 경매 데이터 로그의 행을 분석하고 소켓 io를 통해 웹 사이트의 라이브 피드로 스트리밍하기 위해 구문 분석하는 오래된 게임에 대한 파서를 작성합니다. 파일은 한 번에 100 줄을 보낼 수 있고 파서는 한 번에 하나씩 각 줄을 분석하고 각 줄에서 메타 정보를 추출해야합니다 (예 : 항목, 항목 가격 등)
각 단일 줄에는 for 루프가 있습니다 raw := <-itemChannel
는 goroutine이 완료 될 때까지 차단하기 위해 루프를 발생시키고 전달하는 것처럼 보인다 (관찰에서) 지금
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)
: (이 항목의 목록이 정규 표현식에서 파생 된 부분을 가정) 반대 실행 데이터가 다시 돌아옵니다 (확실히 item.FetchData(itemChannel)
로 실행하는 것은 똑같은 일을합니다.) 데이터가 다시 들어오고 가능한 한 빨리 루프 반복에서 벗어나면 채널에서 어떻게 읽을 수 있습니까? 줄에는 15-20 개의 항목이있어 프로그램이 다음 줄을 파싱하기 전에 2-3 초 동안 중단됩니다. 파서를 가능한 한 빨리 유지하기 위해 다음 라인을 빠져 나가서 빨리 처리 할 수 있기를 바랍니다. 노드의 약속과 비슷한 메커니즘이 있습니까? 여기서는 완료 처리기를 item.FetchData()
의 각 완료에 연결할 수 있습니까?
참고fetchChannel
은 모든 가져 오기 작업이 완료되면 내 항목 유형 내부에 쓰여집니다.
실전에 실행 가능한 코드를 넣을 수 있습니까? –
질문을 이해하는 것이 더 좋습니다. 실제로 FetchData 메소드에 콜백 함수를 추가하여이 문제를 해결했습니다. 요약하면 채널이 차단됩니다. 그렇다면 왜 우리는 채널을 사용합니까? 서로 다른 시스템에 분산되어있는 동일한 프로그램간에 IPC가 더 많습니까? – Alex
예 채널이 버퍼링되지 않는 한 차단됩니다. –