我正在和 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/2和 Kernel.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/
我试图在一个项目中使用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时
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
如何使用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
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
如何在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中能不能做到类似的简洁?我可以只
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.