# channel

31개의 포스트
post-thumbnail

[Go] Channel - Range와 Close

close 전송자는 더이상 보낼 데이터가 없다는 것을 암시하기 위해 channel을 close할 수 있습니다. 수신자는 수신에 대한 표현에 두 번째 매개변수를 할당함으로써 채널이 닫혔는지 테스트 할 수 있습니다. 만약 더 수신할 값이 없고, channel이 닫혀있다면 ok의 값은 false입니다. range 위의 반복문은 channel이 닫힐 때 까지 반복해서 channel에서 값을 수신합니다. 예제 1 channel이 닫혔는지 확인해보는 예제입니다. 결과 for문에서range로 값을 빼기 전에는 true입니다. close되어 수신할 값이 없지만 아직 buffer는 채워져있기에 true가 나옵니다. 이때 b에 값을 하나 받았기 때문에 피보나치 수열의 0값이 함께 나옵니다.

2023년 7월 4일
·
0개의 댓글
·
post-thumbnail

[Go] Channel?

Channel channel은 채널 연산지인 channel은 map과 slice처럼 사용하기 전에 생성되어야만 합니다. 채널은 make()를 통해 생성할 수 있습니다. 기본적으로 전송과 수신은 다른 한 쪽이 준비될 때까지 block상태입니다. 이는 명시적인 lock이나 조건 변수 없이 goroutine이 synchronous하게 작업될 수 있도록 합니다. 예제 코드는 두개의 gorout

2023년 7월 4일
·
0개의 댓글
·

[Android] Coroutine Flow vs Channel

코루틴의 비동기 스트림 API를 지원하는 Flow와 Channel에 대해서 알아보자. 🎈 Channel 채널은 일종의 파이프라인이다. 채널을 열고 한쪽에서 값을 보내면(send) 다른 쪽에서 수신하는(receive) 개념이다.(이렇게 채널을 생성하는 패턴을 파이프라인이라고 한다.) Channel은 여러 방향에서 데이터를 던지고 받는 형식으로 코루틴끼리의 데이터를 전달하기 위해 사용한다. 또한, Channel은 수신하기 전에 데이터를 보내는 특성이 있으며 Hot Stream이라고도 한다. 구조는 BlockingQueue와 비슷하며, 동일하게 Thread-Safe한 형태의 구조를 가지고 있다. [Result] > 1 4 9 16 25 Done! 값을 받을 때마다 출력하며, 두 코루틴이 채널을 통해서 값을 주고 받을 수 있다. 기본적으로 send()와 receive() 로 데이터를 주고 받을 수 있으며 for문을 통해서 receive

2023년 5월 26일
·
0개의 댓글
·

[Kotlin] Coroutine의 SharedFlow 와 Channel

이번에는 Channel을 SharedFlow와 비교 해볼것입니다. 저는 이전에 SharedFlow와 관련한 포스팅을 한적이 있습니다. Shared flow는 hot flow로 comsumer들에게 send를 해주는 channel과 동일한 방식으로 작동됩니다. 다만 사용성에 대해서는 차이가 있는데요 해당 내용을 살펴보겠습니다. 이전 channel에서 사용한것과 마찬가지로 viewmodel에 SharedFlow를 사용해서 이 flow가 계속 될 수 있게 진행 할 것입니다. SharedFlow viewmodel에 Int형 데이터를 담을 수 있는 MutableSharedFlow를 선언하겠습니다. sharedFlow for-loop를 10만번 가량돌면서 그것을 consumer에게 제공하기 위해 sharedFlow에 emit(it)하였습니다. 이것은 hot flow이기 때문에 연속해서 리턴됩니다. [결과] >I/System.out: Collected 0 from shar

2023년 4월 5일
·
0개의 댓글
·

[Kotlin] Coroutine의 Channel 과 Flow

이번에 새로 TO-DO앱을 작성하는데 Channel을 사용하고 있습니다. 계속해서 데이터가 들어와 출력해야 하는 Snackbar에서 Channel을 사용하고 있습니다. 예를들면 MutableList 와 같은 것들은 한번에 데이터를 가져오게 되는데, 이러한 경우가 아닌 데이터들이 실시간으로 가져와서 처리해야 할때 Channel 또는 Flow를 사용합니다. Channel 채널은 한쪽에서 값을 보내는 메서드(send) 다른 쪽에서 받는(receive) 메서드를 사용해서 사용합니다. BlockingQueue와 비슷한 컨셉이라고 합니다. [결과] >1 4 9 16 25 Done! 기본적으로 send()와 receive()로 데이터를 주고 받을 수 있습니다만 for-loop를 통해서 데이터를 receive()를 대신할 수도 있습니다. [결과] >1 4 9 16 25 Done! 위의 코드와 다른점은 channel.close() 부분이 추가되었다는 것인데요. 이

2023년 4월 4일
·
0개의 댓글
·
post-thumbnail

[Flutter/Kotlin/Swift] 예제로 알아보는 네이티브 통신 (Platform Channel)하는 방법_Method Channel / Event Channel

예제로 알아보는 네이티브 통신 (Platform Channel)하는 방법 flutter_bloc equatable 플랫폼 통신(IOS) - Method Channel 플랫폼 통신(IOS) - Event Channel 플랫폼 통신(Android) - Method Channel 플랫폼 통신(Android) - Event Channel

2023년 3월 31일
·
0개의 댓글
·
post-thumbnail

Buffered vs Unbuffered Channel

Go에서는 두 가지 타입의 Channel을 지원한다. Unbuffered Channel Channel 자체가 근본적으로 Goroutine들 간의 통신을 위해 만들어졌는데, Unbuffered Channel은 Goroutine들 간의 동기적인 통신 구현용으로 적합하다. 생산하는 측은 소비하는 측이 준비될 때까지 대기한다. 생산하는 측과 소비하는 측 둘 다 준비되었을 때, 데이터를 주고받을 수 있도록 설계되었다. Buffered Channel Buffered Channel은 내부에 Buffer가 마련되어 있는 Channel이다. 내부의 Buffer는 생산자의 입장에서 데이터를 임시적으로 저장해둘 수 있는 공간이 되어주고, 이는 생산자가 소비자에게 데이터를 비동기적으로 송신할 수 있도록 도와준다. 생산하는 측은 소비하는 측의 준비 여부와는 관계 없이 데이터를 Buffer에 삽입한 후, 자신의 작업을 이어나갈 수 있다. 수신하는 측은 Buffer에서 데이터를 꺼내 소비한

2023년 3월 27일
·
0개의 댓글
·

[Flutter] Lifecycle(앱 상태) 이벤트 3편

Lifecycle(앱 상태) 이벤트 3편 Lifecycle(앱 상태) 이벤트 1편 Lifecycle(앱 상태) 이벤트 2편 Lifecycle(앱 상태) 이벤트 4편 Lifecycle(앱 상태) 이벤트 5편 get | Flutter Package [sharedpreferences | Flutter Package](https://pub.dev/packages/sharedpref

2023년 2월 20일
·
0개의 댓글
·

[Flutter] Lifecycle(앱 상태) 이벤트 2편

Lifecycle(앱 상태) 이벤트 2편 Lifecycle(앱 상태) 이벤트 1편 Lifecycle(앱 상태) 이벤트 3편 Lifecycle(앱 상태) 이벤트 4편 Lifecycle(앱 상태) 이벤트 5편 shared_preferences | Flutter Package App Life Cycle에 대하여 정리해 놓은 인트로 참고하세요 ! [Ap

2023년 2월 19일
·
0개의 댓글
·

[Flutter] Lifecycle(앱 상태) 이벤트 1편

Lifecycle(앱 상태) 이벤트 1편 Lifecycle(앱 상태) 이벤트 2편 Lifecycle(앱 상태) 이벤트 3편 Lifecycle(앱 상태) 이벤트 4편 Lifecycle(앱 상태) 이벤트 5편 Intro Flutter로 앱을 개발하다 보면 앱의 상태에 대한 체크가 필요한 시점이 있다. 앱의 상태는 단순히 보면 실행 중, 백그라운드, 앱 종료 이렇게 나눌 수 있는데, Flutter에서는 4가지의 상태로 분류하여

2023년 2월 18일
·
0개의 댓글
·

9. Channel(채널)이란?

💡 Channel (채널) 채널은 일종의 파이프라인이다. 채널을 열고 한쪽에서 값을 보내면 다른 쪽에서 수신하는 개념이다. 기본적인 사용법 기본적인 사용법은 간단하다. Channel() 함수를 통해 생성할 수 있으며, 데이터를 스트림에 밀어 넣을 땐 send, 스트림에서 받을 땐 receive 를 사용하면 된다. 생성 위치는 상관없지만 send 와 receive 는 suspend 함수이기 때문에 코루틴 내부에서 호출되어야 한다. 채널에 더 이상 아무 데이터도 보내거나 받지 않는다면 채널을 종료시켜야 한다. close 함수를 통해서 종료시킬 수 있으며, 종료 이후에 send, receive 함수는 ClosedReceiveChannelException 을 발생시킨다. 파이프라인 파이프라인은 채널을 생성하는 패턴으로 하나의 코루틴이 초기 데이터를 생성하고, 소비하는 곳에서 받은 후 새로운 데이터를 생성하는 흐름을

2023년 2월 18일
·
0개의 댓글
·

Connection Reset by Peer 문제 해결

Connection Reset by Peer 문제란 뭘까? Client 가 요청을 보냈는데 서버쪽에서 연결이 닫혔다고 다시 연결하라는 RST (Reset) 패킷을 보내는 경우에 이 에러가 발생한다. Client-Server 연결에서 한 쪽만 연결되어있는 좀비 커넥션이 생겼을 때 발생한다. 이 에러가 난 상황은 우리 쪽 Crawler 에서 Straw 에 적재할 때 발생한 에러이다. Straw 쪽에 적재를 하려고 요청을 보냈는데 Straw 쪽에서 연결을 닫은 경우에 발생했다. (사내 문제를 해결한 거라서 용어가 다소 어색할 수 있습니다. Crawler 는 저희 팀이 개발한 어플리케이션이고, Straw 는 여기에 적재할 저장소입니다.) 닫힌 이유 자체는 많을 수 있다. network connection. Firewall and VPN. any proxies and load balancers **idle timeout configuration (th

2023년 2월 14일
·
0개의 댓글
·
post-thumbnail

BIO와 NIO, Selector와 ServerSocket, SocketChannel

Netty 환경에서 Http request 로직을 작성하던 중 NioEventLoopGroup를 이해하기 위해 검색하다가 보게 된 글이 도움이 되어 한글로 옮긴 내용입니다. \* BIO: Blocking I/O \* NIO: Non-blocking I/O BIO의 단점 BIO는 아래와 같은 단점이 존재합니다. 서버 스레드는 새 커넥션을 수락할 때마다 아무것도 하지 못하고 대기 상태에 들어가게 됩니다. 클라이언트는 순서가 될 때까지 큐에서 대기하거나, 동시성이 높은 상황에서 엄청나게

2023년 1월 31일
·
0개의 댓글
·

[Golang] Goroutine & Channel

Goroutine(고루틴) 고루틴은 Go 런타임이 관리하는 가상쓰레드 입니다. Go에서 go 키워드를 사용하여 함수를 호출하면, Go는 런타임시에 새로운 고루틴을 생성합니다. 고루틴은 비동기적으로 함수를 실행하므로, 여러 함수를 동시에 실행하고자 할 때 사용됩니다. 고루틴은 OS의 쓰레드보다 더 가볍게 비동기 동시처리를 구현하기 위해 만들어 졌습니다. 때문에 고루틴은 OS의 쓰레드와 1:1로 대응되지 않고 훨씬 적은 OS의 쓰레드를 사용합니다. Go 런타임이 실행하는 모든 프로그램은 고루틴을 기반으로 동작합니다. main 함수도 고루틴으로 실행됩니다. 때문에 모든 Go 프로그램은 적어도 하나의 (메인)고루틴을 포함합니다. > Goroutine VS Thread WaitGroup Go 프로그램은 main함수 (main고루틴)가 종료되면 모든 (sub)고루틴들도 강제로 종

2022년 11월 30일
·
1개의 댓글
·

[Flutter/Kotlin] 플랫폼 통신(Android) - Event Channel

Event Channel_Android Platform Channel 한 번에 이해하기 - IOS(swift) / Android(kotlin) 플랫폼 통신(IOS) - Method Channel 플랫폼 통신(IOS) - Event Channel 플랫폼 통신(Android) - Method Channel 이번 글에서는 안드로이드의 플랫폼 통신 중 Event Channel에 대해서 알아보도록 하겠다. 안드로이드

2022년 11월 13일
·
0개의 댓글
·

[Flutter/Kotlin] 플랫폼 통신(Android) - Method Channel

Method Channel_Android Platform Channel 한 번에 이해하기 - IOS(swift) / Android(kotlin) 플랫폼 통신(IOS) - Method Channel 플랫폼 통신(IOS) - Event Channel 플랫폼 통신(Android) - Event Channel 이번 글에서는 안드로이드의 플랫폼 통신 중 Method Channel에 대해서 알아보도록 하겠다. 이전 글에서 I

2022년 11월 12일
·
0개의 댓글
·

Go 채널 분배기

Link https://github.com/p9595jh/chdist https://pkg.go.dev/github.com/p9595jh/chdist Channel Distributor Go언어 채널에 여러 구독자를 붙일 수 있는 패키지. 제네릭을 사용하기 때문에 1.18 이상의 버전이 필요하다. 설명 Go언어 채널은 한 번에 하나의 수신만이 가능하다. chdist는 pub-sub 모델을 구현함으로써 일종의 메시지큐 시스템과 같은 이용이 가능하다. 동기식과 비동기식이 모두 제공되며 일반적인 채널을 다루듯이 사용할 수 있다. Distributor Distributor는 생산자를 담당한다. `D

2022년 11월 4일
·
0개의 댓글
·

[Flutter/Swift] 플랫폼 통신(IOS) - Event Channel

Event Channel_IOS Platform Channel 한 번에 이해하기 - IOS(swift) / Android(kotlin) 플랫폼 통신(IOS) - Method Channel 플랫폼 통신(Android) - Method Channel 플랫폼 통신(Android) - Event Channel 이번 글에서는 flutter와 native간의 통신 방식 중 하나인 Event Channel에 대

2022년 10월 30일
·
0개의 댓글
·

[Go] select를 활용한 비동기 프로그래밍

개요 버퍼 없는 채널 사용시 쓰기, 읽기가 동시에 일어나지 않으면 블락이 발생할 수 있음 select를 통해 비동기로 구현 아래 예시는 이번 주제를 설명하기에 적절하지 않을 수 있음 (채널과 고루틴 없이 충분히 구현 가능) 하지만 핵심 부분만 간단하기 설명하기 위함 실제 참고한 코드를 보는 걸 추천 (참고문헌의 loop 함수) 코드 및 출력 예시 프로그램 1초 주기로, 무작위 수를 발생시켜, 짝수일 경우 출력 10초 이후부터 출력 동기 코드 출력 분석 외부 채널(externalItemChan)에 Item을 넘겨주는 순간부터, 고루틴이 블락 10초간 모든 고루틴이 정지됨 비동기 코드 출력 분석 무작위 수 생성 시 채널(randomNumChan)을 사용하고, 별도의 고루틴으로 데이터를 넣기 때문에 1초당 무작위 수 생성 보장하며, 블락되지 않음 출력할 값을 슬라이

2022년 10월 23일
·
0개의 댓글
·

[Go] Channel send/receive 순서 보장

개요 go의 Channel이 순서를 보장하는지 확인 코드 출력 결론 size = 0인 경우, 큐 처럼 순서가 보장 (Unbuffered) send 후 receive할 때 까지 send가 블락되기 때문 size > 0인 경우, 순서가 보장되지 않음 (Buffered) receive와 상관없이 size만큼 send를 미리 할 수 있음 이후 Channel에서 데이터를 꺼낼때, 들어온 순서로 꺼내지 않음 참고문헌 https://stackoverflow.com/questions/25795131/do-buffered-channels-maintain-order

2022년 9월 27일
·
0개의 댓글
·