채널(프로그래밍)
Channel (programming)컴퓨팅에서 채널은 메시지 전달을 통한 프로세스 간 통신 및 동기화 모델입니다.메시지는 채널을 통해 전송될 수 있으며, 다른 프로세스 또는 스레드는 참조가 있는 채널을 통해 전송되는 메시지를 스트림으로 수신할 수 있습니다.채널의 다른 실장은 버퍼링되거나 버퍼링되지 않을 수 있으며 동기 또는 비동기 중 하나입니다.
libthread 채널
운영체제 Plan 9용으로 처음 작성된 멀티스레드 라이브러리 libthread는 고정 크기 채널을 기반으로 스레드 간 통신을 제공합니다.
OCaml 이벤트
OCaml 이벤트모듈은 동기용으로 입력된 채널을 제공합니다.모듈의 송수신 기능이 호출되면 동기화할 수 있는 해당 송수신 이벤트가 생성됩니다.
예
루아 러브2D
Lua 프로그래밍 언어의 일부인 Love2D 라이브러리는 스택과 유사한 푸시 및 팝 연산을 통해 채널을 구현합니다.팝 조작은 데이터가 스택에 존재하는 한 차단됩니다.요구 작업은 pop과 동일하지만 스택에 데이터가 있을 때까지 차단됩니다.
-- loadstring() 등의 함수에 의해 해석되는 코드를 포함하는 문자열. -- 단, 네이티브스레드를 기동하는 경우는 C측입니다. 현지의 스레드 코드 = [[ love.thread.get Channel("test") : push("Hello world!") ]] 기능. 사랑하다.장전() -- 스레드를 시작합니다. 실 = 사랑하다.실.new Thread(새 스레드)(스레드 코드) 실:개시하다() -- 이 스레드는 채널테스트 스택에서 "Hello world!"가 팝업될 때까지 차단됩니다. -- 스레드가 처음 실행되기 전에 채널을 팝할 수 있기 때문에 스택에 데이터가 없을 수 있습니다. -- 이 경우 :pop() 대신 :demand()를 사용합니다.이는 :demand()가 스택에 데이터가 있을 때까지 차단한 후 데이터를 반환하기 때문입니다. 인쇄물(사랑하다.실.get Channel(get 채널)('테스트"):요청.()) -- 스레드는 종료할 수 있습니다. 끝.
XMOS XC
XMOS 프로그래밍 언어 XC는 [1]채널에서 데이터를 송수신하기 위한 원시 유형 "chan"과 두 개의 연산자 "<:" 및 ":>"을 제공합니다.
이 예에서는 XMOS에서2개의 하드웨어 스레드가 시작되어 "par" 블록의 2개의 회선이 실행됩니다.첫 번째 회선은 채널 경유로 번호 42를 송신하고 두 번째 회선은 수신될 때까지 대기하여 x 값을 설정합니다.또한 XC 언어에서는 select 문을 통해 채널에서 비동기 수신이 가능합니다.
찬스 c; 인트 x; 파 { c <: 42; c :> x; }
가세요
이 Go 코드 조각은 XC 코드와 유사하게 작동합니다.먼저 채널 c를 생성하고 다음으로 채널을 통해 42를 송신하는 고루틴을 생성한다.채널 x에 숫자가 입력되면 x는 42로 설정됩니다.Go를 사용하면 채널은 [2]셀렉트블록을 사용하여 콘텐츠를 버퍼링할 수 있을 뿐만 아니라 비블로킹할 수 있습니다.
c := 만들다(찬스 인트) 가세요 기능하다() {c <-> 42}() x := <-> c
녹
Rust는 스레드 간의 통신을 위한 비동기 채널을 제공합니다.채널은 2개의 엔드 포인트 간에 단일 방향의 정보 흐름을 허용합니다.Sender
및 그Receiver
를 클릭합니다.[3]
std::sync::mpsc 사용; std::main() 사용; fn main() {let (snc, rx) = mpsc:channel(); 스레드::snc(move { tx.send(123.mprap(); }); rx.recv(); println!("{:}), result}, result}를 사용합니다.
적용들
채널은 프로세스 간 통신을 위한 기본적인 사용 외에 스트림으로 실현 가능한 다양한 동시 프로그래밍 구성을 구현하기 위해 원시로서 사용될 수 있습니다.예를 들어, 채널은 미래와 약속을 구축하는 데 사용할 수 있습니다. 여기서 미래는 단일 요소 채널이고 약속은 채널에 전송하여 [4]미래를 실현하는 프로세스입니다.마찬가지로 반복기는 [5]채널에서 직접 구성할 수 있습니다.
구현 목록
비표준 라이브러리 기반 채널 구현 목록
레퍼런스
- ^ "Archived copy". Archived from the original on 2016-03-04. Retrieved 2015-05-10.
{{cite web}}
: CS1 maint: 제목으로 아카이브된 복사(링크) - ^ "Effective Go - the Go Programming Language".
- ^ "Channels - Rust By Example". doc.rust-lang.org. Retrieved 28 November 2020.
- ^ "Futures", Go Language 패턴
- ^ "반복자", Go Language Patterns
- ^ "stlab is the ongoing work of what was Adobe's Software Technology Lab. The Adobe Source Libraries (ASL), Platform Libraries, and new stlab libraries are hosted on github". 2021-01-31.