2017-11-17 18 views
0

사용자가 파일을 업로드하고 처리 대기열로 두는 앱을 작성 중입니다. 내 접근 방식은 업로드 된 파일을 처리하기위한 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()을 실행할 수 있기 때문에 차단 보내기를 사용할 수 없습니다.

+0

채널은 업데이트 가능한 플래그로 작동합니다. 앱이 읽을 수있는 신호가 있음을 알립니다. 상황을 단순화 할 수있는 가능성이 있다고 생각합니다. 채널을 통해 치료할 새로운 객체를 전달하십시오. 이는 몇 가지 문제를 해결합니다 : 쉬운 병렬 처리, 경합 조건 보호, 단순화. –

답변

2

신호가 손실되는 것을 방지하려면 용량이 1 인 채널을 사용하십시오.

+0

고마워요! 이것은 훌륭하게 작동합니다. –