concurrency 4

[Concurrency-5] Fan-Out, Fan-In

Best Practices for constructing Pipelines(이어서) Generator: data set을 stream of data on a channel 로 만드는 것이다. channel을 사용함으로써 함수를 사용해서 할 때와 다른 점은 value를 추출하기 위해서 range statement 를 사용할 수 있고, 이를 통해 안전하고 concurrent 하게 사용할 수 있다. 이렇게 각각의 value들뿐만 아니라 pipeline 단계 별로도 concurrent 하다. 단계가 독립적으로 실행된다고 보면 된다. 예시에서 나오는 stage들은 공통으로 사용하는 done channel과 다음 스테이지로 전달되는 channel 에 의해서 interconnected 되어 있다. preemptabl..

Backend with Golang 2023.09.12

[Concurrency-3] Go Channel의 사용

unidirectional channel의 경우 function parameter로 사용되는 경우가 많다. goroutine이 scheduled 되면, exit하는 것에 대한 보장이 되지 않는다. channel을 사용하면, code가 omitted되지 않고 잘 끝날 수 있는데, 이를 통해서 channel이 하는 게 blocking이라고 볼 수 있다. write가 된다면 그것이 빌때까지 기다린다는 것을 의미한다. 이때 Deadlock 이 잘 일어날 수 있는데, main goroutine에서 value가 placed되길 기다리고 있는데, 이게 일어나지 않으면 모든 goroutine 이 asleep되어 deadlock 이 일어나는 것이다. value, ok :=

Backend with Golang 2023.06.13

[Concurrency-2] Chapter 3 channel 전까지

Go는 model of concurrency 로 fork-join model를 따른다. fork라는 단어는 parent와 concurrently 하게 동작하기 위해서 child branch를 split off 할 수 있음을 의미한다. join이라는 것은 미래의 한 시점에 parent로 다시 branch가 join된다는 것을 의미한다. sayHello := func { fmt.Println("hello") } go sayHello() //continue doing other things main function 의 나머지 부분들은 빠르게 실행될 것이고, sayHello 함수가 실행될지 안될지는 undetermined이다. join point를 만드는 것이 중요하다. 그래서 race condition일 뿐인..

Backend with Golang 2023.06.12

[Concurrency-1] Concurrency가 왜 어려운가?

1. Race condition 공유된 자원을 두개이상의 operation이 실행되려고 할때, 그 순서가 보장되지 않게 되고, 가능한 여러개의 시나리오가 발생할 수 있다. 아무리 짧은 코드라도 큰 variability를 가지고 올 수 있는것이다. 2. Atomicity atomic이라는 걸 생각하면 context와 크게 연관되어 있다. 어떻게 scope를 정의하느냐에 따라서, atomic한지 안한지가 다르게 결정될 수 있다. the atomicity of an operation can change depending on the currently defined scope! atomic이라면 concurrent context 안에서는 safe하다는 것을 암시한다. 많은 statement들이 atomic 하지..

Backend with Golang 2023.05.28