엘릭서 스트림은 iterables를 제공하지만 관찰 할 수있는 정보는 찾을 수 없습니다 (Google은 도움이되지 않았습니다). 누군가가 저를 위해 자원으로 나를 가리킬 수 있으면 크게 감사 할 것입니다.Elixir : Observables
답변
관찰 가능 스타일 코드를 작성하기 위해 Stream과 Enum을 결합 할 수 있습니다. 여기 관찰 방식으로 작성된 에코 서버의 예 : 기본적으로
IO.stream(:stdio, :line)
|> Stream.map(&String.upcase/1)
|> Enum.each(&IO.write(&1))
, 당신은 표준 입력에 보내는 각 행에 대해,이 대문자로 변환 한 후 다시 표준 출력으로 인쇄됩니다. 이것은 간단한 예이지만 주목할 점은 관측 가능을 구성하는 데 필요한 모든 것이 이미 Stream과 Enum을 통해 사용 가능하다는 것입니다.
이 응답을 보완하기 위해 "관찰 가능 스타일"을 사용하는 언어는 다른 스레드에서 실행되는 "구독"메소드/기능을 제공 할 수 있습니다. Elixir에서는 다른 프로세스를 쉽게 생성하고 다른 프로세스에서 스트림을 생성/소비 할 수 있으므로 그러한 추상화가 필요하지 않습니다. 예를 들어 위의 코드를 새로운 프로세스 내부에 스폰하기 만하면됩니다 :'spawn_link (fn -> ... code.above ... end)' –
Observable의 푸시 특성으로 인해 couple 스트림에서 지원하지 않는 merge 및 take_until과 같은 관찰 가능한 동작.그러나 Elixir 열거 형은 접을 수 있으며 자원으로 잘 작동하므로 관찰 가능한 기능의 대부분이 여기에 있습니다. –
@ JoséValim OP가 다른 스레드에서 스트림을 펼칠 수있는 약간 다른 점을 묻고 있다는 인상을 받았습니다. 내 대답을 보라. –
엘릭서 스트림은 기능 구성보다 추상화 된 것입니다. 결국, 당신이 얻는 것은 입력 스트림을 반복하고 변환하는 함수, 호출입니다.
예를 들어 Twitter4j에서 상태 저장 스트림을 만들려면 (1 초 동안 새로운 트위터 법령을 버퍼링하고 하나의 목록으로 모두 보내려면) 상태를 가질 수있는 빌딩 블록을 사용해야합니다. Elixir에서는 프로세스에 상태를 캡슐화하는 것이 일반적입니다.
예는이
tweetsPerSecond =
twitterStream
|> SS.buffer({1, :second})
|> SS.map(&length(&1))
SS.subscribe(tweetsPerSecond, fn n -> IO.puts "Got #{n} tweets in the last second" end)
SS.subscribe(tweetsPerSecond, fn n -> IO.puts "Second subscriber" end)
SS
처럼 보일 수 있습니다 우리가 관찰 할 수있는 기능을 구현하기 위해 작성해야하는 새로운 모듈입니다. 핵심 아이디어 (내가 얻은 한)를 수정하지 않고 스트림을 구독 할 수 있습니다.
이 작업을 수행하려면 twitterStream
자체가 다른 사용자가 사용하는 이벤트를 방출하는 프로세스 여야합니다. 이 경우 Stream
을 사용할 수 없습니다. 즉, 일정 기간이 경과 한 후에 스트림의 다음 요소에서 대기하는 것을 중단 할 수없는 '차단 풀'의미론이 있기 때문입니다.
엘 릭셔에서 동등한 기능을 수행하려면 GenEvent
모듈을 살펴보십시오. 이벤트를 내보내고 구독 할 수있는 기능을 제공합니다. 내가 알고있는 것이 아니라 스트림을위한 인터페이스가 없다.
나는 "관찰 가능한 패턴"의 종류 인 http://mendrugory.weebly.com/blog/pub-sub-system-in-elixir을 따라 한 Pub-Sub 시스템의 PoC를 만들었습니다.
상태를 유지하려면 (어떤 프로세스에 알려야하는지) 나는 Agent을 사용했습니다.
해결해야 할 문제를 기술하십시오. 아마도 관측 대상을 사용하는 다른 언어의 예입니까? –
나는 스트리밍 API를위한 클라이언트를 만들고 싶지만 콜백은 사용하지 않는다. http://www.nurkiewicz.com/2014/01/turning-twitter4j-into-rxjavas.html – tldr
"observables"와 유사한가요? Elixir와 Erlang은 둘 다 깊이있는 에이전트 기반입니다. 에이전트 기반 아키텍처를 갖는 것보다 관찰 가능한 개념을 사용하는 것이 훨씬 더 어렵습니다. 당신의 질문은 숲 옆에 서서 목재를 찾을 수있는 곳을 묻는 것과 유사합니다. –