2017-02-11 1 views
-1

내 코드는 복잡하지는 않지만 간단히 말하자면 여러 개의 go 루틴을 가지고 있고, 모두 다른 tcp 서버를 다이얼링하고 for 루프에서 입력을 읽는다. 스트림 상에 판독 가능한 메시지가 존재한다. 여태까지는 그런대로 잘됐다. 이제는 '고객'의 이전 묶음을 관리하고 사용자가 원할 때 닫습니다. 이를 위해 저는 각 'conn'을 적절한 일상적인 클라이언트와 연결하고이를 닫는 작업을 수행했습니다.conn.read는 다른 이동 루틴을 통해 닫는 conn에서 무한 루프로 간다.

내가 겪고있는 문제는 모든 conn 객체의 close 함수를 호출하자마자 해당 'Read'함수가 빈 문자열을 계속 읽는 무한 루프에 들어간다는 것입니다. 내가 하나를 나타내는 '클래스를'이 한마디로 DR

,

은 내가 routines- https://play.golang.org/p/wq7zt9Kqz7

TL 가서 여러의 연결을 처리하고있는 방식과 유사 간단한 코드를 작성 그것의 주소, conn, waitgroup과 원격 서버와 나는 여러 인스턴스를 생성하고 별도의 이동 루틴에서 입력에 대한 처리입니다. 그리고 또 다른 일상에서 내가 그 인스턴스 중 하나를 닫으려고 노력하고있다. 그리고이 read()는 무한 루프에있다.

+0

정확하게 waitgroup을 닫고 있습니까? 샘플 코드가 그것에 대해 아무 것도 말하지 않기 때문에 묻고 있습니다. 또한 서브 루틴을 올바르게 닫으면 샘플 코드가 문서화되지 않습니다. – Fallen

답변

0

나는 세마포어 (채널, 내부 메서드 선택)를 사용해야한다고 생각한다. 중지를 호출하면 메시지 (부울 또는 int)를 보내고 메서드가이 채널에서 메시지를 받으면 연결을 닫고 go rutine을 멈춰라.

짧은 예를

select{ 
case <- stopChannel: 
//Do stuff to close connection 
case default: 
//Do stuff to read from connection 
} 

더 많은 예를 닫힌 연결이 Stackoverflow

+0

채널이 가장 먼저 선택되었지만 문제는 "원격 서버"의 인스턴스를 동적으로 만들려고했기 때문에 채널을 사용하는 방법을 파악할 수 없었습니다. 대기 그룹의 경우 새 서버 요청이있을 때마다 루프에서 wg.Add (1)을 쉽게 사용했습니다. – darthvading

1

Read 찾을 수있는 오류를 반환합니다.

TCP 연결에서 Read에서 반환 된 오류가 발생하면 응용 프로그램이 읽기 루프에서 벗어나야합니다. Break on error는 모든 경우를 처리합니다. 응용 프로그램이 다른 goroutine에서 연결을 닫고 피어가 연결을 종료하고 네트워크 오류가 발생합니다.

TCP 연결의 가까운 쪽과 해당 연결의 판독기 사이를 조정하는 데 다른 동기화는 필요하지 않습니다.

관련 문제