草庐IT

c# - 来自 golang 和 c# 的 elixir 函数的并行或异步任务

coder 2024-07-07 原文

我正在和 Phoenix 一起学习 Elixir。我很容易地构建了一些 REST API 服务器,但是我还需要实现一个要求。我需要能够执行并行或异步任务以从后端调用/执行某些 API,并将这些结果放入 JSON 响应中。

这就是我从 Go 和 C# 中大致实现它的方式

// Golang
userCount := make(chan int)
usersList := make(chan []Users)

go getAggregateUserCounts(userCount)
go getGetUsersList(usersList)

// do other heavy tasks from here

httpJsonResponse(map[string]interface{}{
    "test":       1,
    "user_count": <-userCount,
    "users_list": <- usersList ,
})



// C# or dotnetcore
public async Task<JsonResult> GetJson(string dbName, string collection)
{
    using(var client = new MongoDBCon())
    {
        // some heavy computations
        var documents = await col.FindAsync<Users>(FilterDefinition<Users>.Empty);
        return Json(new {
              users_count: await documents.ToListAsync().Result.Count,
              users: await users.GetusersList()
        });
    }
}

到目前为止,这就是我所拥有的 Elixir :

// Elixir
def start do
  IO.puts "starting.."
  response = %{}
  1..3
  |> Enum.map(fn(id) -> async_get_request(id) end)
  |> Enum.each(
    fn(_) -> 
      item = get_result()
      IO.inspect :"#{item[:user][:id]}"
      IO.inspect item[:user]

      # Map.put(response, :"#{item[:user][:id]}", item[:user])
    end)

  IO.puts "done.."
  IO.inspect response
end

def start2 do
  IO.puts "start2.."
  res = %{
    "item" => Task.async(fn -> IO.puts "weee" end) 
  }
end

def get_request(id) do
  sleep = :rand.uniform(10)
  :timer.sleep(sleep)  
  %{user: %{id: id, sleep: sleep}}
end  

def async_get_request(id) do
  caller = self()
  spawn(fn ->  
    send(caller, {:result, get_request(id)})  
  end)      
end

def get_result do
  receive do
    {:result, result} -> result
  end
end

结果是

iex(3)> Para.start
starting..
%{id: 2, sleep: 1}
%{id: 3, sleep: 3}
%{id: 1, sleep: 9}
done..
%{}

我想要的是拥有,是

%{
 id: 2, {id: 2, sleep: 1},
 id: 3, {id: 3, sleep: 3},
 id: 1, {id: 1, sleep: 9}
 }

上面的例子只是为了学习或练习,但对于现实世界,我更愿意通过一些并行任务向 map 添加值。

我不确定使用 elixir 是否可行。

 %{
    "users_count": AsyncUsersModule.GetUsersTotal(),
    "users_list": AsyncUsersModule.GetUsersList()
 }

json 中的响应应该是

{
  "users_count": 10000,
  "users_list": []
}

我知道我还需要大量的练习和阅读,我只是需要一些帮助。

最佳答案

我相信你需要的是Task.yield_many/2Kernel.SpecialForms.for/1处理结果:

results = 
  1..3
  |> Enum.map(&Task.async(fn -> get_request(&1) end))
  |> Task.yield_many()

for { _, {:ok, value}} <- results, do: IO.inspect(value)

关于c# - 来自 golang 和 c# 的 elixir 函数的并行或异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52289296/

有关c# - 来自 golang 和 c# 的 elixir 函数的并行或异步任务的更多相关文章

  1. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  2. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  3. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  4. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  5. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  6. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  7. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  8. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  9. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐