【问题标题】:Mix task spawning a process does nothing混合任务产生一个进程什么都不做
【发布时间】:2018-08-01 21:52:09
【问题描述】:

我创建了一个生成进程的混合任务。 它使用Flow,从流中读取并写入consumer 中定义的文件。

归根结底,它只是产生了一些进程。

如果我通过 iex 运行它,只要我让 shell 运行,它就可以正常工作。

但是,如果我从命令行将它作为混合任务启动,则没有任何反应,你如何让进程保持打开状态?

  use Flow

  def run([stream]) do
    specs = [{{ProdCon,[]},[]}]
    consumer = [{{Consumer,[]},[]}]

    stream
    |> Flow.from_enumerable()
    |> Flow.through_specs(specs)
    |> Flow.into_specs(consumer)
  end

【问题讨论】:

    标签: elixir elixir-mix


    【解决方案1】:

    生成一个 Task 来完成这项工作并等待它以 Task.yield/2 完成:

    use Flow
    
    def run([stream]) do
      task = Task.async(fn ->
    
        specs = [{{ProdCon,[]},[]}]
        consumer = [{{Consumer,[]},[]}]
    
        stream
        |> Flow.from_enumerable()
        |> Flow.through_specs(specs)
        |> Flow.into_specs(consumer)
    
      end)
    
      case Task.yield(task, 3_600) do # wait 1 hour
        {:ok, result} -> result
        nil -> IO.puts("Failed to get a result :(")
      end
    end
    

    【讨论】:

    • mmm 不工作,不做任何事情,所有使用 Flow 和 def run 都在另一个模块中定义,但不认为会改变任何东西
    • 我很确定错误是被诱导的。相同的代码对我有用,例如这里:github.com/am-kantox/test_cluster_task/blob/master/lib/mix/….
    • mm 使用 Flow 可能会有所不同?
    • 这不太可能。尝试创建虚拟应用程序并运行它而不是纯 GenServer 可能吗?
    • 我认为守卫和任务这两种方法都可以解决这个问题,问题在我的流程中,我会接受答案
    猜你喜欢
    • 1970-01-01
    • 2017-07-02
    • 2016-09-25
    • 1970-01-01
    • 2019-01-15
    • 2022-01-14
    • 2017-03-14
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多