[英]Elixir: Observables
Elixir流提供迭代,但我找不到任何關於observable的信息(谷歌在這里沒有幫助)。 如果有人能指出我同樣的資源,我將不勝感激。
您可以將Stream和Enum結合起來編寫可觀察樣式的代碼。 以下是以可觀察方式編寫的echo服務器的示例:
IO.stream(:stdio, :line)
|> Stream.map(&String.upcase/1)
|> Enum.each(&IO.write(&1))
基本上,對於發送到標准輸入的每一行,它將轉換為大寫,然后打印回標准輸出。 這是一個簡單的例子,但關鍵是你需要編寫一個observable才能通過Stream和Enum獲得。
Elixir中的流是功能組合的抽象。 最后,你得到的只是一個函數,調用它將循環輸入流並轉換它。
為了構建有狀態的流,如Twitter4j中的示例(在一秒鍾內緩沖新的twitter規則並將它們全部分配到一個列表中),您將需要使用可以具有狀態的構建塊。 在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
,因為它具有“阻塞拉”語義,即在經過一段固定的時間后,您將無法中斷等待流中的下一個元素。
要在Elixir中實現等效功能,請查看GenEvent
模塊。 它提供發出和訂閱事件的能力。 雖然它沒有類似流的界面,但並不是我所知道的。
我已經建立了一個Pub-Sub系統的PoC,我遵循了一種“可觀察模式”: http : //mendrugory.weebly.com/blog/pub-sub-system-in-elixir 。
為了保持狀態(必須通知什么過程)我使用了代理 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.