for i := 0; i < mr.nMap; i++ {
DPrintf("worker number is %d\n", mr.workerNumber)
worker_str = <- mr.registerChannel
DPrintf("Worker_str is %s \n",worker_str)
args := &DoJobArgs{mr.file,"Map",i,mr.nReduce}
var reply DoJobReply
var ret bool
ret = call(worker_str, "Worker.DoJob", args, &reply)
if ret {
fmt.Println("wk worker done.\n")
fmt.Println(worker_str)
mr.registerChannel <- worker_str // <=======stuck here
} else
{
fmt.Println("wk worker fail.\n")
}
DPrintf("map finished.")
}
을 걸 채널로 다시 자원을 넣어 씨는이 인스턴스이다 . worker_str을 사용할 수 있으며이 작업자를 사용한 후에이 리소스를 다시 넣으려고합니다. 그것을 다시 채널에 놓고, 다음 일자리가 가능한 근로자를 이용하게하십시오.GoLang, 내 프로그램 BTW
왜 멈 춥니 까? 감사합니다.
예, 도움이됩니다. 이제 버퍼링 된 채널을 사용하여 문제가 해결되었습니다. 코코를 감상하십시오. – BufBills
요약하자면 ** 버퍼링을 추가하기 전에 교착 상태 문제를 해결하는 것이 좋습니다 **. 종종 버퍼링을 추가하는 것이 교착 상태 문제를 연기하기 만합니다. 무슨 일이 일어 났는지 이해하고 버퍼링 대신에 원인을 수정하는 것이 좋습니다. 그러나 버퍼링을 사용하면 성능이 크게 향상 될 수 있습니다. 따라서 오류 동작을 수정하는 대신 성능 튜닝 측면에서 버퍼링을 생각하는 것이 좋습니다. –