코드 있습니다 :골란. 공황 유형
func (c *Connector) SendPacketFuture(p []byte) (future chan []byte) {
defer func() {
// TODO Check r to catch only chan panics
if r := recover(); r != nil {
future = nil
}
}()
t := newConnectorTask(p)
c.tasks <- t
future = t.PacketFromServerChan
return
}
TODO
꽤 자기 설명이다. c.tasks
은 채널이며 다른 goroutine으로 닫을 수 있습니다. 닫을 수있는 채널로 보낼 수있는 안전한 방법이 없으므로 여기서 당황 스러울 것입니다. 문제는 다른 패닉이 발생할 수 있으며 닫힌 chan으로 작성하여 발생하는 것에 반응하고 싶습니다.
Go에서이 작업을 수행 할 수 있습니까?
일반적으로이를 감지하지 않아야하며 프로그램을 설계하는 다른 방법이 있습니다. 프로그램을 중단시키려는 공포감의 이유가 있습니다. – JimB
TTL 캐시를 기반으로 제작되었습니다. 커넥터에서 미래를 만들려고 할 때 희박한 경쟁 조건이 있습니다. 만료되었고 캐시에서 제거되었습니다. SharedMutex를 추가하여 사물을 동기화 할 수 있지만 _potential_ RC를 해결하면서 일정한 런타임 비용 만 추가합니다. 공포감을 다루는 것은 나에게 합당한 해킹처럼 보입니다 –
하지만 채널이 폐쇄되는 이유는 무엇입니까? 닫기는 발신자 (보통)가 보내는 신호이므로 채널이 닫힐 때 패닉 상태입니다. – JimB