2017-02-05 1 views
-1

일반적으로 메모리 요구 사항과 Go 루틴의 설정/제거 비용 측면에서 오버 헤드가 거의 없으므로 실용적인 스레드 풀을 구현하는 것도 관련이 있습니까? 요청 당 루틴을 '스폰'하는 대신 언제 스레드 풀을 사용 하시겠습니까?'스레드 풀링'은 Go와 관련이 있습니까?

+0

차단 IO를 사용하는 경우 goroutine 대신 스레드 풀을 사용하는 것이 좋습니다. – ymonad

+0

@ymonad, IO 차단으로 무엇을 의미합니까? Go에서 모든 IO는 블로킹입니다.이 모든 것이 동시성 모델입니다. 내부적으로 네트워크 IO와 다른 파일 IO를 의미한다면, 문제는 goroutines에 관한 것이 아닙니다. syscall을 반환하기를 기다리는 실제 OS 스레드에 관한 것입니다. – creker

+0

@crecker 내가 의도 한 바는 non-blocking 인 go 네트워크 라이브러리를 사용하는 것이었다. 그러나 goroutine의 M : N 쓰레드 모델의 이점을 얻을 것이다. IO를 차단하는 시스템 호출을 사용할 때 스케줄러가 바뀐다. goroutine 당 하나의 스레드를 생성하므로 스레드 풀을 사용하는 것이 옵션 일 수 있습니다. https://groups.google.com/forum/#!topic/golang-nuts/Luje-okL4jI – ymonad

답변

2

골란에서 많은 양의 골 루틴을 산란시키고 유지하는 것은 저렴하지만 무료는 아닙니다.

또한 goroutine 자체는 매우 저렴할 수 있지만 동시에 많은 메모리가 goroutine 코드 내에 할당 될 수 있음을 기억해야합니다. 그래서 동시에 실행되는 goroutine의 수를 제한하고자 할 수 있습니다.

리소스를 제한하기 위해 세마포를 사용할 수 있습니다. 또 다른 접근법 (더 많은 관용적 인 방법)은 작업자 풀과 함께 실행 파이프 라인을 사용하는 것입니다. 이 패턴은 golang blog에 잘 설명되어 있습니다.

1

네, 맞습니다. db/sql은 새 연결에 시간이 걸리기 때문에 데이터베이스에 대한 연결 풀을 사용합니다.

+1

이것은 주제를 약간 벗어났습니다 - 풀링 데이터베이스 연결은 스레드 풀링과 완전히 같지 않습니다. –

관련 문제