我在当前目录中有一个文件.erlang我运行erl shell编译一些模块.
有没有办法从Erlang shell重新运行此文件.
我运行erl我得到shell 1>并从那里运行run_file(".erlang"),这个文件执行当前shell中的指令并加载env.
该文件看起来像
compile:file(file1).
compile:file(file2).
compile:file(file3).
...
Run Code Online (Sandbox Code Playgroud) 我正在编写一个使用erlang减少实现的地图.
为了通知映射已完全完成(所有数据都已处理完毕),我正在创建执行实际映射的工作人员和"管理器进程"之间的链接,该工作将捕获EXIT来自工作人员的信号,并看到如果原因是normal.如果是这样,它会认为工作正常运行.如果没有,基于此Pid,它将确定失败的工作并为该工作产生另一名工人(我将保留一份Pid工人的书).一旦收到EXIT来自所有的Reason = normal的信号Pid,映射就完全完成了.
我的问题是,1)这样安全吗?2)这是一个好习惯吗?
顺便说一句,这些工作是幂等的.
我为一个名为band_supervisor的主管定义了simple_one_for_one工作规范,子规范id是jam_musician:
init([]) ->
{ok, {{simple_one_for_one, 3, 60},
[{jam_musician,
{musicians, start_link, []},
temporary, 1000, worker, [musicians]}
]}};
Run Code Online (Sandbox Code Playgroud)
音乐家模块是:
-module(musicians).
-behaviour(gen_server).
-export([start_link/2, stop/1]).
-export([init/1, handle_call/3, handle_cast/2,
handle_info/2, code_change/3, terminate/2]).
-record(state, {name="", role, skill=good}).
-define(DELAY, 750).
start_link(Role, Skill) ->
gen_server:start_link({local, Role}, ?MODULE, [Role, Skill], []).
stop(Role) -> gen_server:call(Role, stop).
Run Code Online (Sandbox Code Playgroud)
我可以通过以下方式创建许多工人:
3> supervisor:start_child(band_supervisor, [drum, good]).
Musician Arnold Ramon, playing the drum entered the room
{ok,<0.696.0>}
3> supervisor:start_child(band_supervisor, [guitar, good]).
Musician Wanda Perlstein, playing the guitar entered the room
{ok,<0.698.0>}
Run Code Online (Sandbox Code Playgroud)
我注意到所有工人都有相同的Child spec Id: …
我有一个嵌套的模型,并希望做一些基本的管道.我的最终目标是删除任何嵌套映射,其中id == ""包含以下参数:
params = %{"name" => "OuterModelName", "InnerModel" => %{"0" => %{"id" => "2"}, "1" => %{"id" => "3"}, "2" => %{"id" => ""}}}
要删除id ==""以下管道工程:
blanksRemoved =
params
|> Map.update! "InnerModel", fn(innerMap) ->
Enum.filter(innerMap,fn{k,v} -> byte_size(v["id"]) !=0 end) end
Run Code Online (Sandbox Code Playgroud)
blanksRemoved现在是:
%{"name" => "OuterModelName", "InnerModel" => [{"0", %{"id" => "2"}}, {"1", %{"id" => "3"}}]}
注意innerModel变成了一个数组,所以我需要将该数组转换回结构.
asStruct =
blanksRemoved |> Map.update! "InnerModel", fn(innerMap) ->
Enum.into(innerMap,%{}) end
Run Code Online (Sandbox Code Playgroud)
这符合预期,我得到:
%{"name" => "OuterModelName", "InnerModel" => %{"0" => %{"id" => …
Elixir 是如何Enum.map([Task.t], &Task.await)工作的?
async_1 = Task.async(fn ->
IO.inspect("done async 1")
1
end)
async_2 = Task.async(fn ->
IO.inspect("done async 2")
2
end)
results = Enum.map([async_1, async_2], fn(task) ->
IO.inspect("starting new task")
IO.inspect(task)
Task.await(task)
end)
IO.inspect(results)
Run Code Online (Sandbox Code Playgroud)
从上面的代码,我得到了IO日志:
"starting new task"
"done async 1"
"done async 2"
%Task{pid: #PID<0.51.0>, ref: #Reference<0.0.0.78>}
"starting new task"
%Task{pid: #PID<0.52.0>, ref: #Reference<0.0.0.79>}
[1, 2]
Run Code Online (Sandbox Code Playgroud)
"starting new task"出现之前"done async 2"。它是如何急切地执行所有异步任务的?await“等待任务回复并返回它”。我认为这意味着它将暂停调用方进程,直到从Task进程发送回完成消息。如果是这种情况,它应该Task.await(Task.t)在每次map迭代中的每次调用时暂停,并且永远不会真正同时执行这些任务。日志证明我的假设是错误的。但是错在哪里呢?这是我的 …
据说函数是 Elixir/Erlang 中的一等公民。函数可以作为消息传递吗?
在探索 Elixir API 时,我遇到了Agent#get_and_update(agent, fun, timeout \\ 5000). 我想获取和更新操作是原子的。我认为这是可能的唯一方法是fun在代理进程而不是与代理交互的客户端进程上运行。
如果fun在客户端进程上运行,则会带来许多有关保证原子性和客户端进程失败的问题。
我正在尝试使用elixir / phoenix创建一个地理负载平衡器,以便在客户端最初连接时,它将选择最近的(最少ping /等待时间)服务器,并将该服务器用于将来的连接。
假设客户到达的平衡器get "/balance", PageController, :index,并且在我的数据库中,我有2台服务器:server1.domain.com和server2.domain.com。是否可以通过某种方式将客户端的连接(或ping)传递给带有elixir后端的两个服务器?
我可能可以在前端进行逻辑处理,使用js进行ping操作,然后将值返回到后端进行存储。但是,我宁愿一切都在后端。
有关负载平衡的任何提示或建议都值得赞赏,因为我不确定100%是否是这样做的正确方法。谢谢!
我有用erlang和命令处理程序编写的tcp服务器.如果客户端连接到我的服务器,然后关闭如何捕获网络断开连接?
我在Elixir中生成一个随机字符串,如下所示:
len = 10
val = :crypto.strong_rand_bytes(len)
|> Base.url_encode64()
|> binary_part(0, len)
Run Code Online (Sandbox Code Playgroud)
此代码的输出可以包含我不想要的连字符和下划线.将字母表限制为仅限[0-9a-Z]字符的方法是什么?
elixir ×5
erlang ×4
async-await ×1
asynchronous ×1
client ×1
concurrency ×1
disconnect ×1
erlang-otp ×1
latency ×1
sockets ×1