사용자가 파일을 업로드하고 처리 대기열로 두는 앱을 작성 중입니다. 내 접근 방식은 업로드 된 파일을 처리하기위한 goroutine을 만들고 채널을 사용하여 새 파일을 처리 할 준비가되었음을 알리는 것입니다. 이 비는 것을작업자의 goroutine에 대한 항목을 큐에 넣는 올바른 방법은 무엇입니까?
select {
case signalChan <- true:
default:
}
참고 :
이for {
while itemForProcessing() {
processNextItem()
}
select {
case <-signalChan:
case <-stopChan:
return
}
}
새로운 항목이 처리를위한 준비가되어 있음을 신호의 코드는 다음과 같은 :
기본적으로 처리 goroutine이 수행 차단 채널에서 보냅니다.
세 가지 시나리오가있다 :
- 처리 goroutine은 —
select{}
블록의 첫 번째 경우에 실행하고, 다음 항목 - 가공 처리 goroutine 다음 항목 것이다
processNextItem()
—를 실행 loop condition이true
- 일 때 처리가 완료되면
processNextItem()
이 반환됩니다. 처리하는 goroutine이 루프 을 종료했지만 아직 완료되지 않았습니다.select{}
블록을 입력했습니다.
마지막 시나리오는 문제가됩니다. 비 차단 송신은 채널에서 아무 것도 전송하지 않으며 goroutine은 다른 일이 발생할 때까지 select{}
블록에서 대기합니다.
이 문제를 어떻게 피할 수 있습니까? 처리기 goroutine이 매우 오랜 시간 동안 차단을 일으킬 수있는 processNextItem()
을 실행할 수 있기 때문에 차단 보내기를 사용할 수 없습니다.
채널은 업데이트 가능한 플래그로 작동합니다. 앱이 읽을 수있는 신호가 있음을 알립니다. 상황을 단순화 할 수있는 가능성이 있다고 생각합니다. 채널을 통해 치료할 새로운 객체를 전달하십시오. 이는 몇 가지 문제를 해결합니다 : 쉬운 병렬 처리, 경합 조건 보호, 단순화. –