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

Elixir `Task.async`在测试中的`exto.Multi`内的查询超时,elixir,Elixir,我正在努力在exto.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

我正在努力在
exto.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{owner: #PID<0.352.0>, pid: #PID<0.354.0>,
      ref: #Reference<0.2903625078.3861118978.56327>}
%Task{owner:#PID,PID:#PID,
参考:#参考}
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
**(退出#PID)退出:GenServer.call(#PID,{:checkout,#Reference,true,15000},5000)
**(退出)超时
奇怪的是,我试着在
Multi
之外执行相同的代码,但它工作正常。。。此问题是否与
Multi
的工作方式有关


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

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

听起来像是任务的深度嵌套导致了某种竞争条件。您是否介意尝试使用而不是
任务。等待/2
?我认为这与。我在
Task.async(fn->Repo.insert(…)end)|>任务中遇到超时错误。在
Repo.transaction
中等待。感谢@mudasobwa的建议,我已经检查了它,不幸的是,这没有起作用。看起来很有可能像michalmuskala在他的回答中所建议的那样。所以,你是说这不是
Multi
的问题,而是
事务的问题。这是有道理的。谢谢你的建议!