簡體   English   中英

Elixir:Observables

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM