小编Hyn*_*dil的帖子

Erlang多处理消息的接收和发送

我正在研究"学习一些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)

erlang message multiprocessing

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

为什么这个erlang代码不起作用?

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程序员,在此先感谢:)

erlang process concurrent-programming

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

Erlang:阻止C NIF呼叫行为

我观察到C NIF的阻塞行为,当它们被许多Erlang进程同时调用时.可以做成非阻塞吗?这里有mutex工作,我无法理解吗?

PS一个基本的"Hello world"NIF可以通过在特定调用它的情况下使其成为sleep一百来进行测试.可以观察到,调用NIF的其他PID等待该睡眠在执行之前执行.microsecondsPID

在并发可能不会造成问题的情况下(例如,数组推送,计数器增量),非阻塞行为将是有益的.

我共享链接至4个要旨,其包含的spawner,conc_nif_callerniftest分别模块.我试图修改价值,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)

c concurrency erlang erlang-nif

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

如何使用递归函数列出erlang中的偶数?

如何使用Erlang中的递归函数以这种方式生成偶数.

注意:输出列表的长度是函数的输入 func

例:

> mod:func(5).
[2,4,6,8,10]
Run Code Online (Sandbox Code Playgroud)

erlang recursion

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

Erlang NIF 数字返回类型

我正在尝试 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 无法处理这么大的数字?

c erlang erlang-nif

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

How to have a sum of numbers so that sum(4) would do 1+2+3+4

-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?

erlang erlang-shell

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

erl_nif_thread与erlang进程通信

我们可以与创建的 erl_nif 线程和正常的 erlang 进程进行通信吗?我们可以使用nif_send从nif线程向erlang进程发送消息,但是nif线程可以像普通erlang进程一样从任何erlang进程接收消息吗?

erlang erlang-nif

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

以32位int反转每4位

反转每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)

但是如何解决上述问题呢?

c bit-manipulation

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

在Erlang中打印一个理解换行符(\n)的字符串

我有这样的事情:Run = "Test run [number\n".当我这样做时io:format("~p", [Run]),我没有看到换行符(它打印\n在字符串中).

如何打印到屏幕(或文件),这样的字符可以理解它们(例如换行符)?

erlang

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

erlang中的-pa和-pz是什么?

我试图在我看到以下命令的地方修改mod_log_chat模块ejabberd-contribbuild.sh

erl -pa ../ejabberd-dev/ebin -pz ebin -make
Run Code Online (Sandbox Code Playgroud)

有人可以解释什么是-pa-pz?我没有从网上获得满意的信息.

erlang ejabberd

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

在Erlang中匹配地图

我怎么能在Erlang中这样匹配?

#{o => 0} = maps:put(o, 0, maps:new()).
"Illegal pattern"
Run Code Online (Sandbox Code Playgroud)

从我在erlang shell中可以读到的内容来看,这些值是等价的.为什么我不匹配?

erlang

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

()的Erlang函数?

根据我的理解,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 time for-loop

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