小编Pee*_*ger的帖子

有没有办法在erlang shell中运行带有指令的文件?

我在当前目录中有一个文件.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

1
推荐指数
1
解决办法
917
查看次数

在erlang中使用链接机制跟踪作业是个好主意吗?

我正在编写一个使用erlang减少实现的地图.

为了通知映射已完全完成(所有数据都已处理完毕),我正在创建执行实际映射的工作人员和"管理器进程"之间的链接,该工作将捕获EXIT来自工作人员的信号,并看到如果原因是normal.如果是这样,它会认为工作正常运行.如果没有,基于此Pid,它将确定失败的工作并为该工作产生另一名工人(我将保留一份Pid工人的书).一旦收到EXIT来自所有的Reason = normal的信号Pid,映射就完全完成了.

我的问题是,1)这样安全吗?2)这是一个好习惯吗?
顺便说一句,这些工作是幂等的.

erlang

1
推荐指数
1
解决办法
92
查看次数

为什么simple_one_for_one工作人员可以共享相同的Child Spec Id?

我为一个名为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: …

erlang erlang-otp

1
推荐指数
2
解决办法
2220
查看次数

elixir管道,如果新变量可以管道,如果直接送到管道就不能管道,为什么?

我有一个嵌套的模型,并希望做一些基本的管道.我的最终目标是删除任何嵌套映射,其中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 phoenix-framework

1
推荐指数
1
解决办法
834
查看次数

Enum.map 如何与 Task.await 一起工作?

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)
  1. 我希望第二个"starting new task"出现之前"done async 2"。它是如何急切地执行所有异步任务的?
  2. 文档中,它会说await“等待任务回复并返回它”。我认为这意味着它将暂停调用方进程,直到从Task进程发送回完成消息。如果是这种情况,它应该Task.await(Task.t)在每次map迭代中的每次调用时暂停,并且永远不会真正同时执行这些任务。日志证明我的假设是错误的。但是错在哪里呢?

这是我的 …

concurrency asynchronous elixir async-await

1
推荐指数
1
解决办法
507
查看次数

在 Elixir/Erlang 中可以将函数作为消息传递吗?

据说函数是 Elixir/Erlang 中的一等公民。函数可以作为消息传递吗?

在探索 Elixir API 时,我遇到了Agent#get_and_update(agent, fun, timeout \\ 5000). 我想获取和更新操作是原子的。我认为这是可能的唯一方法是fun在代理进程而不是与代理交互的客户端进程上运行。

如果fun在客户端进程上运行,则会带来许多有关保证原子性和客户端进程失败的问题。

elixir

1
推荐指数
1
解决办法
399
查看次数

Elixir / Phoenix地理负载均衡器

我正在尝试使用elixir / phoenix创建一个地理负载平衡器,以便在客户端最初连接时,它将选择最近的(最少ping /等待时间)服务器,并将该服务器用于将来的连接。

假设客户到达的平衡器get "/balance", PageController, :index,并且在我的数据库中,我有2台服务器:server1.domain.comserver2.domain.com。是否可以通过某种方式将客户端的连接(或ping)传递给带有elixir后端的两个服务器?

我可能可以在前端进行逻辑处理,使用js进行ping操作,然后将值返回到后端进行存储。但是,我宁愿一切都在后端。

有关负载平衡的任何提示或建议都值得赞赏,因为我不确定100%是否是这样做的正确方法。谢谢!

latency load-balancing elixir phoenix-framework

1
推荐指数
1
解决办法
292
查看次数

Erlang catch断开客户端

我有用erlang和命令处理程序编写的tcp服务器.如果客户端连接到我的服务器,然后关闭如何捕获网络断开连接?

sockets erlang client disconnect

0
推荐指数
1
解决办法
741
查看次数

如何限制仅生成[0-9a-Z]个字符的随机字符串?

我在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

0
推荐指数
2
解决办法
880
查看次数