我正在研究"学习一些Erlang"一书.我在使用Erlang进行多处理编程时有几个问题要实现.基本上,我正在阅读并模仿"了解你的一些二郎".我在程序中生成了一个带有一些导向函数的程序.它说冰箱可以像自己一样存放和拿走.所以我正在处理我的程序,以便在基本遵循以下的操作中执行某些操作:
首先,我需要终止消息应该与store和take相同的形式.这意味着消息应该是{from, terminate},接收者回复消息{self(), terminated}.
其次,我想通过消息回复发件人无组织{From, Msg}的消息{self(), {not_recognized, Msg}}.
第三,添加库存消息{From, {inventory} }将返回到FoodListsender2进程中的当前发送者(From).
第四,添加窥视消息{From, {peek, a} }将查看存储在该过程中的项目.如果存在时,将消息发送回发送器(从): {present, a}.如果不存在,将消息发送回发送器(从): {not_present, a}.
我对冰箱本身的使用感到困惑.我用教程中的示例代码想出了类似下面的内容:
-module(kitchen).
-compile(export_all).
fridge1() ->
receive
{From, {store, _Food}} ->
From ! {self(), ok},
fridge1();
{From, {take, _Food}} ->
%% uh ...
From ! {self(), not_found},
fridge1();
terminate ->
ok
end.
fridge2(FoodList) ->
receive
{From, {store, Food}} ->
From ! {self(), ok},
fridge2( [Food | …Run Code Online (Sandbox Code Playgroud) fib(N)->
P1 = spawn(fun concFib:conFib/0),
P2 = spawn(fun concFib:conFib/0),
X=rpc(P1,N-2),Y=rpc(P2,N-1),X+Y.
conFib()->
receive
{Client,N} -> Client ! regfib(N)
end.
rpc(Pid,Request)->
case erlang:is_process_alive(Pid) of
true -> begin
Pid ! {self(),Request},
receive
{Pid,Respond} -> Respond
end
end;
false -> io:format("~w process is dead.",[Pid])
end.
regfib(N)->
case N<2 of
true -> 1;
false -> regfib(N,1,1,1)
end.
regfib(N,N,X,_)-> X ;
regfib(N,M,X,Y)-> regfib(N,M+1,X+Y,X).
Run Code Online (Sandbox Code Playgroud)
想法是将fib(N)过程分成两个过程,一个计算fib(N-2),另一个计算calc.fib(N-1)同时为fib(N)= fib(N-1)+ fib(N-2).当我运行前面的代码时,没有任何事情发生,光标在有限循环中停止或等待未到达结果.
plzzz我需要帮助我是一个新的Erlang程序员,在此先感谢:)
我观察到C NIF的阻塞行为,当它们被许多Erlang进程同时调用时.可以做成非阻塞吗?这里有mutex工作,我无法理解吗?
PS一个基本的"Hello world"NIF可以通过在特定调用它的情况下使其成为sleep一百来进行测试.可以观察到,调用NIF的其他PID等待该睡眠在执行之前执行.microsecondsPID
在并发可能不会造成问题的情况下(例如,数组推送,计数器增量),非阻塞行为将是有益的.
我共享链接至4个要旨,其包含的spawner,conc_nif_caller和niftest分别模块.我试图修改价值,Val我确实观察到了非阻塞行为.通过为spawn_multiple_nif_callers函数指定一个大整数参数来确认这一点.
链接 spawner.erl,conc_nif_caller.erl,niftest.erl,最后是niftest.c.
下面的行由我的Mac上的Erlang REPL打印.
Erlang/OTP 17 [erts-6.0] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Run Code Online (Sandbox Code Playgroud) 如何使用Erlang中的递归函数以这种方式生成偶数.
注意:输出列表的长度是函数的输入 func
例:
> mod:func(5).
[2,4,6,8,10]
Run Code Online (Sandbox Code Playgroud) 我正在尝试 NIF,但我对 Erlang 正在使用的数字类型感到困惑,因为我的精度有些奇怪。
这是一个例子:
erlang:band(18446744073709551614, 5) == 4
Run Code Online (Sandbox Code Playgroud)
从 NIF 内部来看,它看起来像这样:
long long l, r;
enif_get_long(env, argv[0], &l);
enif_get_long(env, argv[1], &r);
return enif_make_long(env, l & r);
Run Code Online (Sandbox Code Playgroud)
我得到一个1结果。
这是否与 C 层未保存正确的数字“大小”有关?或者这enif_(get|make)_long不是处理如此大小的数字的正确方法?或者仅仅是 NIF 无法处理这么大的数字?
-module(test).
-export([sum/1]).
sum([]) -> 0;
sum([X|Xs]) -> X + sum(Xs)
Run Code Online (Sandbox Code Playgroud)
This is what I have done so far though it only sums the numbers within a list like test:sum([1,2,3,4])
but I want it so that its like test:sum(4) will output 1+2...+n
How can I do this?
我们可以与创建的 erl_nif 线程和正常的 erlang 进程进行通信吗?我们可以使用nif_send从nif线程向erlang进程发送消息,但是nif线程可以像普通erlang进程一样从任何erlang进程接收消息吗?
反转每4位中的每个位,例如:
0101 1011 1100 0110 becomes
1010 1101 0011 0110
Run Code Online (Sandbox Code Playgroud)
另一个:
1010 1100 0101 1100 becomes
0101 0011 1010 0011
Run Code Online (Sandbox Code Playgroud)
我可以考虑将所有32位反转如下:
unsigned int reverseBits(unsigned int num)
{
unsigned int count = sizeof(num) * 8 - 1;
unsigned int reverse_num = num;
num >>= 1;
while(num)
{
reverse_num <<= 1;
reverse_num |= num & 1;
num >>= 1;
count--;
}
reverse_num <<= count;
return reverse_num;
}
Run Code Online (Sandbox Code Playgroud)
但是如何解决上述问题呢?
我有这样的事情:Run = "Test run [number\n".当我这样做时io:format("~p", [Run]),我没有看到换行符(它打印\n在字符串中).
如何打印到屏幕(或文件),这样的字符可以理解它们(例如换行符)?
我试图在我看到以下命令的地方修改mod_log_chat模块ejabberd-contribbuild.sh
erl -pa ../ejabberd-dev/ebin -pz ebin -make
Run Code Online (Sandbox Code Playgroud)
有人可以解释什么是-pa和-pz?我没有从网上获得满意的信息.
我怎么能在Erlang中这样匹配?
#{o => 0} = maps:put(o, 0, maps:new()).
"Illegal pattern"
Run Code Online (Sandbox Code Playgroud)
从我在erlang shell中可以读到的内容来看,这些值是等价的.为什么我不匹配?
根据我的理解,Erlang没有能力进行for循环.但是在此代码段中,它使用函数for().我真的不明白这个()函数所以任何帮助都是适用的.
-module(helloworld).
-export([max/1,start/0]).
max(N) ->
Max = erlang:system_info(process_limit),
io:format("Maximum allowed processes:~p~n" ,[Max]),
statistics(runtime),
statistics(wall_clock),
L = for(1, N, fun() -> spawn(fun() -> wait() end) end),
{_, Time1} = statistics(runtime),
{_, Time2} = statistics(wall_clock),
lists:foreach(fun(Pid) -> Pid ! die end, L),
U1 = Time1 * 1000 / N,
U2 = Time2 * 1000 / N,
io:format("Process spawn time=~p (~p) microseconds~n" , [U1, U2]).
wait() ->
receive
die -> void
end.
for(N, N, F) -> [F()];
for(I, N, F) -> [F()|for(I+1, N, …Run Code Online (Sandbox Code Playgroud) erlang ×11
c ×3
erlang-nif ×3
concurrency ×1
ejabberd ×1
erlang-shell ×1
for-loop ×1
message ×1
process ×1
recursion ×1
time ×1