使用Elixir中的Supervisor监视流

时间:2016-07-08 12:37:21

标签: twitter elixir

我使用ExTwitter库来使用如下流来轮询数据:

stream = ExTwitter.stream_sample(receive_messages: true)
for message <- stream do
  case message do
    tweet = %ExTwitter.Model.Tweet{} ->
      IO.puts "tweet = #{tweet.text}"

    deleted_tweet = %ExTwitter.Model.DeletedTweet{} ->
      IO.puts "deleted tweet = #{deleted_tweet.status[:id]}"

    limit = %ExTwitter.Model.Limit{} ->
      IO.puts "limit = #{limit.track}"

    stall_warning = %ExTwitter.Model.StallWarning{} ->
      IO.puts "stall warning = #{stall_warning.code}"

    _ ->
      IO.inspect message
  end
end

它工作得很好,但现在我想用Supervisor监控流。最简单的方法是什么?

1 个答案:

答案 0 :(得分:2)

最简单的方法是将此代码放在新模块的函数中,添加start_link函数,只需通过spawn_link调用此函数,并将该模块添加为worker到你的Supervisor。这是一个简单的例子:

defmodule M do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    children = [
      worker(M.Streamer, []),
    ]

    opts = [strategy: :one_for_one, name: M.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

defmodule M.Streamer do
  def start_link do
    {:ok, spawn_link(__MODULE__, :main, [])}
  end

  def main do
    IO.inspect(self)
    for i <- Stream.cycle([1, 2, 3]) do
      IO.puts i
      :timer.sleep(1000)
    end
  end
end

演示:

#PID<0.85.0>
iex(1)> 1
2
3
1
2
3
1
2
Process.exit3pid(0, 85, 0), :kill)

#PID<0.88.0>
1
true
iex(2)> 2
3
1
2
3
1
2
3
Process.exit(pid(0, 88, 0), :kill)
#PID<0.90.0>
true
1
iex(3)> 2
3
1
2
3

这可能有点难以理解,因为我输入时输出正在发生,但是每当Streamer开始时都会打印所有PID值,Process.exit行是我输入的代码,并且true是这些调用的返回值。正如您所看到的,每当我杀死M.Streamer进程时,它都由主管重新启动。