当调试foo具有列表推导的模块(例如)临时函数名称时,例如
foo:'-loop/4-lc$^2/1-3-'
Run Code Online (Sandbox Code Playgroud)
可以在跟踪输出或错误消息中找到.如果许多列表推导在一个模块中,通常很难找出哪一个正在运行.
如何解释函数名称?
这些函数的调用参数有什么意义?
返回值的含义是什么?
我正在运行一个分布式的erlang系统,每台机器有一个节点.
由于DNS不可用,我都用相同的-sname参数启动它们,例如
erl -sname foo ...
Run Code Online (Sandbox Code Playgroud)
操作系统守护程序具有在/bin/sh发生特定事件时(当USB棒被拖入系统时)执行shell()命令的功能.
我正在寻找一种简单的方法来使用这个shell命令在本机的本地erlang节点上调用一个函数(在检测到并安装了USB记忆棒后采取进一步的操作).
我正在考虑erl -sname bar从shell 调用并运行一些看起来像的代码
[_,Host] = string:tokens(atom_to_list(node()), "@"),
The_node = list_to_atom("foo@" ++ Host),
spawn(The_node, My_fun),
Run Code Online (Sandbox Code Playgroud)
这是要走的路吗?或者是开始一个全新的erlang节点过度杀戮(虽然不会经常这样做)
或者更好地谈论gen_tcp打开的套接字,或者读取命名管道.
还是其他任何建议?
BTW这是在Unix系统上运行的.
我必须在Erlang中实现文件监视器功能:应该有一个进程列出文件,如果特定目录,并在文件出现时执行某些操作.
我看看OTP.所以目前我有以下想法:1.创建将控制gen_servers的Supervisor(每个文件夹一个服务器)2.为我想要监视的每个文件夹创建WatchServer - gen_server.3.创建ProcessFileServer - 应该对文件执行某些操作的gen服务器)假设复制到不同的folder =
所以第一个问题:WatchServer不应该等待请求,它应该在预定义的时间间隔内生成一个.
目前我在init/1函数中创建了一个计时器,并在handle_info函数中处理on_timer事件.
现在问题:1.有更好的想法吗?2.如何通知ProcessFileServer找到的文件?它对我来说,单独创建WatchServers和ProcessServers会更方便,但在这种情况下我不知道向谁发送消息?
可能有一些类似的项目/库可用吗?
我尝试将消息转发给gen_server:
gen_server:cast({global, ID}, {watchers}).
Run Code Online (Sandbox Code Playgroud)
处理程序是:
handle_cast({watchers}, State) ->
case State#table_state.watchers of
[] ->
{reply, no_watchers, State};
_ ->
{reply, State#table_state.watchers, State}
end;
Run Code Online (Sandbox Code Playgroud)
但是当我执行gen_server:castgen_server时会终止并出现错误:
=ERROR REPORT==== 29-Apr-2011::18:26:07 ===
** Generic server 1 terminating
** Last message in was {'$gen_cast',{watchers}}
** When Server state == {table_state,1,"1",11,[]}
** Reason for termination ==
** {bad_return_value,{reply, no_watchers, {table_state,3,"3",11,[]}}}
Run Code Online (Sandbox Code Playgroud)
我为什么要这样bad_return_value?
我有一个通用的测试套件,它尝试创建一个 ets 表以用于所有套件和所有测试用例。它看起来像这样:
-module(an_example_SUITE).
-include_lib("common_test/include/ct.hrl").
-compile(export_all).
all() -> [ets_tests].
init_per_suite(Config) ->
TabId = ets:new(conns, [set]),
ets:insert(TabId, {foo, 2131}),
[{table,TabId} | Config].
end_per_suite(Config) ->
ets:delete(?config(table, Config)).
ets_tests(Config) ->
TabId = ?config(table, Config),
[{foo, 2131}] = ets:lookup(TabId, foo).
Run Code Online (Sandbox Code Playgroud)
该ets_tests函数因 badarg而失败。创建/销毁每个测试用例的 ets 表,如下所示:
-module(an_example_SUITE).
-include_lib("common_test/include/ct.hrl").
-compile(export_all).
all() -> [ets_tests].
init_per_testcase(Config) ->
TabId = ets:new(conns, [set]),
ets:insert(TabId, {foo, 2131}),
[{table,TabId} | Config].
end_per_testcase(Config) ->
ets:delete(?config(table, Config)).
ets_tests(Config) ->
TabId = ?config(table, Config),
[{foo, 2131}] = ets:lookup(TabId, foo).
Run Code Online (Sandbox Code Playgroud)
运行这个,我发现它运行得很好。
我对这种行为感到困惑,无法确定为什么会发生这种情况,形成docs …
我正在努力第一次实现一个主管,我遇到了一些我无法从文档中找到的问题.具体来说,当我尝试使用SlowRamp.flood我开始我的过程{:error, {:invalid_child_spec, []}}.
这是一个非常简单的应用程序,使用mix new slow_ramp --sup.
主要文件./lib/slow_ramp.ex是:
defmodule SlowRamp do
use Application
# See http://elixir-lang.org/docs/stable/elixir/Application.html
# for more information on OTP Applications
def start(_type, _args) do
import Supervisor.Spec, warn: false
children = [
worker(SlowRamp.Flood, [])
]
# See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: SlowRamp.Supervisor]
Supervisor.start_link(children, opts)
end
def flood do
Supervisor.start_child(SlowRamp.Supervisor, [])
end
end
Run Code Online (Sandbox Code Playgroud)
我的子函数/文件在./lib/SlowRamp/flood.ex,看起来像这样:
defmodule SlowRamp.Flood do
def start_link do
Task.start_link(fn -> …Run Code Online (Sandbox Code Playgroud) 我想执行一个(慢)python脚本,我希望我的Elixir进程阻塞,直到它收到脚本的所有输出.
是Elixir的System.cmd/3还是Erlang的os:cmd/1保证同步?如果没有,是否有其他方式进行同步操作系统调用?
我发现在Elixir中传递消息所花费的时间与消息的大小成正比,而我预计它会相对恒定.由于数据结构是不可变的,因此运行时应该能够通过引用(在恒定时间内)在进程之间传递大型结构.考虑以下测试.
use Bitwise
defmodule PerfTask do
def pack(s) do
{millis, packed} = :timer.tc(fn -> Enum.to_list(s) end)
IO.puts("packed in #{millis} millis")
Task.async(fn -> packed end)
end
def unpack(t) do
{millis, unpacked} = :timer.tc(fn -> Task.await(t) end)
IO.puts("unpacked in #{millis} millis")
unpacked
end
def go(n) do
IO.puts "n = #{n}"
1..n |> pack |> unpack
end
end
PerfTask.go(1 <<< 20)
Run Code Online (Sandbox Code Playgroud)
在列表中有2 ^ 20个元素,打印出来
n = 1048576
packed in 106481 millis
unpacked in 9916 millis
Run Code Online (Sandbox Code Playgroud)
构建列表需要大约10倍的时间才能将其排除在外Task.(请注意,列表是在任务启动之前构建的.所有任务都要返回已经构建的列表.)
在列表中有2 ^ 22个元素,它会打印出来
n = …Run Code Online (Sandbox Code Playgroud) 当runnig
mix phoenix.server
undefined function Hex.SCM.managers/1
Run Code Online (Sandbox Code Playgroud)
正在回归 有人知道我应该安装哪个包吗?Elixir的版本为1.2.3,Erlang/OTP 18提前感谢您
我目前正在使用phoenix开发一个网站,并有一个应在后台播放的视频部分。
尽管它在Chrome和Firefox上运行良好,但在Safari上却无法运行。
我怀疑这是因为牛仔没有正确提供HTTP范围请求。
有没有一种方法可以启用(如果默认情况下禁用)?
$ curl -H Range:bytes=16- -I http://localhost:4000/videos/vid_home_1.mp4
HTTP/1.1 200 OK
server: Cowboy
date: Tue, 12 Apr 2016 14:41:20 GMT
content-length: 633787
cache-control: public
etag: 480A03F
content-type: video/mp4
Run Code Online (Sandbox Code Playgroud)
nginx服务器显示为206时:
$ curl -H Range:bytes=16- -I http://localhost/videos/vid_home_1.mp4
HTTP/1.1 206 Partial Content
Server: nginx/1.8.0
Date: Tue, 12 Apr 2016 14:46:17 GMT
Content-Type: video/mp4
Content-Length: 633771
Last-Modified: Mon, 11 Apr 2016 12:26:26 GMT
Connection: keep-alive
ETag: "570b97f2-9abbb"
Content-Range: bytes 16-633786/633787
Run Code Online (Sandbox Code Playgroud) elixir ×5
erlang ×5
common-test ×1
cowboy ×1
debugging ×1
distributed ×1
erlang-otp ×1
gen-server ×1
performance ×1
sh ×1
testing ×1