gpt4 book ai didi

在 Elixir 中异步运行长时间运行的任务

转载 作者:行者123 更新时间:2023-12-02 03:50:42 24 4
gpt4 key购买 nike

我有一个以 csv 格式保存数据的模块,根据数据大小,这需要相对较长的时间。 Elixir 异步完成此任务的方法是什么?我尝试使用代理,但过程超时。

enter image description here

defmodule FinReporting.Export_CSV do
alias FinReporting.DistributeRepo
alias FinReporting.InterfaceMdl
import Ecto.Query

def start_link do
Agent.start_link(fn -> HashDict.new end, name: __MODULE__)
end

def export do
Agent.update(__MODULE__, fn dict ->

export_sub()
end)
end

defp export_sub do
file = File.open!("test.csv",[:write, :utf8])
IO.puts("===> CSV export of NGInterface file started.")
DistributeRepo.all(from entry in InterfaceMdl, limit: 100000, select: %{ field1: entry.field1, amount: entry.amount})
|>Enum.map(fn(entry)-> %{entry|amount: Decimal.to_string(entry.amount)}end)
|> Enum.map(fn(m) -> [m.field1, m.amount] end)
|> CSV.encode
|> Enum.each(&IO.write(file, &1))

IO.puts("===> CSV export of NGInterface file completed.")
_ = File.close(file)
end
end

最佳答案

您可以使用Agent.update的第三个参数指定自定义超时。 。您可以传递一个指定毫秒数的整数,例如60000一分钟,或 :infinity无限超时。

Agent.update(__MODULE__, fn dict -> export_sub() end, 60000)

但是,Agent.update等待函数完成执行,这不是您想要的。

您想要Task具体来说Task.async/1 .

Task.async(fn -> export_sub() end)

这将返回 Task指示您可以稍后在应用程序中使用 Task.await 等待或使用 Task.yield 询问其状态。所有这些以及更多内容在 the documentation of Task 中有详细解释。 .

关于在 Elixir 中异步运行长时间运行的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45529093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com