`Task.async`在测试中`Ecto.Multi`内的查询超时

时间:2017-07-25 20:11:59

标签: elixir

我正在努力在Ecto.Multi中的一个步骤中执行异步操作。在这里,我只提供最小版本来描述我的问题:

defmodule MyModule do
  do my_function(repo \\ Repo) do
    Ecto.Multi.new()
    |> Ecto.Multi.run(:example, &perform_example(&1, repo))
    |> repo.transaction()
  end

  def perform_example(_changes_so_far, repo) do
    Task.async(fn -> repo.all(DataModule) end)
    |> IO.inspect() # 1.
    |> Task.await() # 2.
    |> IO.inspect()
  end
end

MyModule.my_function(Repo)

1。似乎正常工作,因为它Task结构:

%Task{owner: #PID<0.352.0>, pid: #PID<0.354.0>,
      ref: #Reference<0.2903625078.3861118978.56327>}

2。很遗憾引发错误:

     ** (EXIT from #PID<0.352.0>) exited in: GenServer.call(#PID<0.353.0>, {:checkout, #Reference<0.2903625078.3861118978.56400>, true, 15000}, 5000)
         ** (EXIT) time out

奇怪的是,我尝试在 Multi之外执行相同的代码并且它工作正常......这个问题是Multi如何工作的问题吗? / p>

我尝试使用相关功能来运用此代码,这似乎正常工作。在测试环境中执行时,这只是Multi步骤中的一个问题。

1 个答案:

答案 0 :(得分:1)

Ecto不支持使用单个事务的多个进程。目前尚不清楚这种设置的语义是什么,以及如果其中一个进程失败会发生什么。