본문 바로가기

전체 글42

ultimate in go-(9) 동시성(고루틴) 고루틴(goroutine) go 스케쥴러 go가 시작할때, 사용 가능 코어 개수를 확인한다. os 스레드 m개와 소프트웨어 스레드 n개를 잘 스케줄링하는것이 go runtime의 역할중 하나이다. 이러한 작동은 하이퍼스레딩, 코어당 스레드 수, 클럭 주기등의 요소를 반영하여서 작동한다. 작동방식 예시 프로세서 p는 os 스레드 m을 할당받아서 작동한다. 리눅스의 스케줄러에는 실행 대기열이 존재한다.(go에는 global run queue(GRQ)가 존재하며, p에는 local run queui(LRQ)가 존재한다.) go프로그램 시작시, 런타임은 고루틴을 생성한다. 특성 프로세서 p를 LRQ에 넣는다 고루틴은 스레드와 같이 sleeping, executing, runnable(하드웨어에 의해서 실행될때까.. 2023. 1. 26.
ultimate in go (8)- interface변환 및 주의사항 변환 인터페이스 변환 type Mover interface { Move() } type Locker interface { Lock() Unlock() } type MoveLocker interface { Mover Locker } type bike struct {} func (bike) Move() { fmt.Println("Moving the bike") } func (bike) Lock() { fmt.Println("Locking the bike") } func (bike) Unlock() { fmt.Println("Unlocking the bike") } func main() { var ml MoveLocker var m Mover ml = bike{} m = ml //ok ml = m //x } .. 2023. 1. 25.
ultimate in go(7)- decoupling 디커플링 Xenia 라는 시스템은 데이테베이스를 가지고 있다. Pillar라는 또 다른 시스템은 프론트엔드를 가진 웹서버이며 Xenia를 이용한다. Pillar 역시 데이터베이스가 있다. Xenia의 데이터를 Pillar에 옮겨보자. 포인트는 2가지 테스트 커버리지가 어느정도인지 추후 변경되는 부분들을 리팩토링으로 대응가능한지 각 계층이 자신의 역할을 제대로 한다면, 성능이나 최적화는 나중에 해도 된다. 옳바른 동작에 초점을 맞추는게 중요stucture composition(구조체를 통한 기능 구현) xenia의 데이터를 추출하는 기능이 필요(pull) 추출한 데이터를 pillar에 저장하는 기능 필요(store) pull과 store를 유기적으로 묶어주는 기능 실제 데이터가 아닌 임의로 "Data"라고.. 2023. 1. 24.
ultimate in go (6)- grouping grouping(그룹핑) 상태에 의한 그룹핑 type Animal struct { Name string IsMammal bool } func (a *Animal) Speak() { fmt.Println("UGH!", "My name is", a.Name, ", it is", a.IsMammal, "I am a mammal") } type Dog struct { Animal PackFactor int } func (d *Dog) Speak() { fmt.Println("Woof!", "My name is", d.Name, ", it is", d.IsMammal, "I am a mammal with a pack factor of", d.PackFactor) } type Cat struct { Animal C.. 2023. 1. 24.