- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的情况如下 -
我有一个带有函数 foo() 的客户端 C,它执行一些计算。
我想要一个不知道 foo() 的服务器 S 来执行这个函数,并将结果发送回客户端。
我正在尝试确定在 Erlang 中执行此操作的最佳方式。我正在考虑:
最佳答案
如果计算函数是自包含的,即不依赖于客户端 C 上的任何其他模块或函数,那么您需要做的是 fun
(功能对象)。 fun
可以通过网络发送并由远程机器和在 fun
中应用,发件人已经嵌入了他们的地址和获取答案的方法。所以执行者可能只看到一个 fun
他们可能会或可能不会提出论点,但在乐趣中,发件人强制使用了一种方法,通过该方法,答案将自动发回。 fun
是一个事物中很多任务的抽象,它可以作为参数移动。
在客户端,你可以有这样的代码:
%% 客户端某处
%% 客户端在 node() == 'client@domain.com' 上运行
-模块(客户端)。
-编译(export_all)。
-定义(服务器,{服务器,'server@domain.com'})。
give_a_server_a_job(Number)-> ?SERVER ! {build_fun(),Number}。
build_fun()->
FunObject = fun(Param)->
答案 = 参数 * 20/1000,此处计算 %%
rpc:call('client@domain.com',client,answer_ready,[Answer])
结尾,
有趣的对象。
answer_ready(答案)->
%%% 使用 Answer 来处理各种有趣的事情....
io:format("\n\tAnswer is here: ~p~n",[Answer]).
然后服务器有这样的代码:
%%% 服务器上的某个地方
%%% 服务器在 node() == 'server@domain.com' 上运行
-模块(服务器)。
-编译(export_all)。
start()-> register(server,spawn(?MODULE,loop,[]))。
循环()->
收到
{Fun,Arg} ->
Fun(Arg), %% 服务器执行作业
%% 作业自动发回答案
%% 给客户
环形();
停止 -> 退出(正常);
_ -> 循环()
结尾。
通过这种方式,作业执行器不需要知道如何发回回复,作业本身知道它将如何发回回复,但是发送的作业!。我在几个项目中都使用过这种通过网络发送功能对象的方法,太酷了!!!
#### 编辑 #####
如果您有递归问题,请使用 funs
操作递归。 .但是,您至少需要在客户端和/或服务器上使用一个库函数来帮助进行递归操作。创建一个函数,它应该在客户端和服务器的代码路径中。
另一种选择是从服务器向客户端动态发送代码,然后使用库:Dynamic Compile erlang
从客户端在服务器上加载和执行 erlang 代码。使用动态编译,这里是一个例子:1> String = "-module(add).\n -export([add/2]).\n add(A,B) -> A + B.\n"。
"-module(add).\n -export([add/2]).\n add(A,B) -> A + B。\n"
2> dynamic_compile:load_from_string(String)。
{模块,添加}
3> 添加:添加(2,5)。
7
4>
我们在上面看到的是一段从字符串动态编译和加载的模块代码。如果启用此功能的库在服务器和客户端可用,则每个实体都可以将代码作为字符串发送,并在另一个实体上动态加载和执行。此代码可以在使用后卸载。让我们看看斐波那契函数以及它如何在服务器上发送和执行:
%% 这是我们要转换为字符串的普通斐波那契代码:
-模块(fib)。
-导出([fib/1])。
fib(N) 当 N == 0 -> 0;
fib(N) 当 (N < 3) 和 (N > 0) -> 1;
fib(N) 当 N > 0 -> fib(N-1) + fib(N-2)。
%% 在 String 格式中,这将成为这段代码
StringCode = "-module(fib).\n -export([fib/1]).\nfib(N) 当 N == 0 -> 0;\n fib(N) 当 (N < 3) and (N > 0) -> 1;\n fib(N) 当 N > 0 -> fib(N-1) + fib(N-2)。\n"。
%% 然后客户端将上面的这个字符串发送到服务器,服务器将 %% 动态加载代码并执行它
send_fib_code(Arg)->
{ServerRegName,ServerNode} ! {string,StringCode,fib,Arg},
好的。
get_answer({fib,of,This,is,That}) ->
io:format("Fibonacci (from server) of ~p is: ~p~n",[This,That])。
%%% 在服务器
循环(服务器状态)->
收到
{string,StringCode,Fib,Arg} 当 Fib == fib ->
试试 dynamic_compile:load_from_string(StringCode) 的
{module,AnyMod} ->
答案 = AnyMod:fib(Arg),
%%% 将答复发送回客户端
%%% 应该是异步的
%%% 因为 channel 不同而不是
%% 客户端等待
rpc:call('client@domain.com',client,get_answer,[{fib,of,Arg,is,Answer}])
捕获
_:_ -> error_logger:error_report(["无法从客户端动态编译和加载模块"])
结尾,
循环(服务器状态);
_ -> 循环(服务器状态)
结尾。
那段粗略的代码可以告诉你我想说什么。但是,请记住卸载所有不可用的动态模块。您也可以通过一种方法让服务器在再次加载之前尝试检查此类模块是否已加载。我建议你不要复制和粘贴上面的代码。查看并理解它,然后编写自己的版本来完成这项工作。成功 !!!
关于Erlang:将客户端进程/功能卸载到服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7917108/
我想实现一个 Erlang 解释器,最近我在阅读 Erlang 的标准库源代码。我在 erlang.erl 中找到 erlang:display/1 的源代码是: %% display/1 -spec
我即将用 Erlang 构建一个系统(我的问题可以用多个 CPU 更好地解决),我已经浏览了: 向你学习一些 Erlang; Erlang/OTP 在行动 编程 Erlang(阿姆斯壮); Erlan
我真的很难理解 Erlang 中的尾递归。 我有以下 eunit 测试: db_write_many_test() -> Db = db:new(), Db1 = db:write(f
我不确定或者我不知道 erlang 定位不在默认目录中的模块的传统方式。我知道它会查看已编译的文件夹和 erlang 的系统文件夹或 - lists:foreach(fun (E) -> io:fwr
对 Erlang 完全陌生。我正在尝试为函数组合定义一些函数,例如 compose , juxt和 pipe但是遇到这样一个事实,即 Erlang 没有(据我所知)可变参数,因此很难只编写适用于所有输
在 Erlang 中存储和管理高性能可变对象的最佳方法是什么?假设我想编写具有实时游戏玩法的非常简单的在线游戏服务器。不知何故,我需要在 Erlang 内存中表示玩家的状态。例如,它可能只是一个简单的
警告:前面的 erlang n00b。 我正在尝试掌握 erlang,只是尝试与牛仔一起使用基本的 hello world 应用程序。我正在模拟一个错误,基本上是在我的代码中的某处返回一个无效值,并试
当你向 shell 进程发送消息时,你可以通过调用: c:flush(). 来清除所有消息。 C:\Windows\System32>erl Eshell V5.9(使用 ^G 中止) 1> 自我()
这应该是一个简单的问题,但我不太了解文档,无法找到答案。 如果 OTP 管理器在崩溃后重新启动 gen_server,新子进程是否继承了崩溃进程的消息队列,或者消息是否在崩溃之前发送但尚未由旧子进程处
我将 net_ticktime 值设置为 600 秒。 net_kernel:set_net_ticktime(600) 在 net_ticktime = TickTime 的 Erlang 文档中:
我正在监视一个 Erlang 应用程序,我目前正在尝试确定特定 PID 已经运行了多长时间。绝对时间戳或持续时间对我有用,但我在 process_info 或通过 sys 模块看不到这些数据位中的任何
我想重新定义查找特定单词的元组的顺序 例如,我有一个像这样的元组列表: [{"a",["r001"]}, {"bi",["bidder"]}, {"bo",["an"]}] 但有时元组的顺序可能会
以下几行出现在 http://aosabook.org/en/riak.html 中,在该部分的第二段: 15.1. Erlang 简介 : "Calling the function with a
我认为 Erlang 节点之间的消息不应该很大。如果我想构建一个流服务器,通常每个连接都需要很大的带宽,Erlang 能做好吗?如果是,是否有任何开源代码可供我学习?我了解到 Erlang 很适合处理
下一个代码在结果中给了我 5.999999999999998,但正确答案是 6。 Alpha = math:acos((4*4 + 5*5 - 3*3) / (2*4*5)) Area = 1/2 *
注意:这是我的 previous question 的进化延续。关于类似的话题。 一段时间以来,我一直在寻找有关部署和更新 Erlang/OTP 版本(一组应用程序)的“最佳实践”,但我找不到任何直接
我试图在头文件中指定一个函数。 像这样: -spec update(pid(), tuple(tuple(), integer(), atom()), tuple(atom(), atom())) -
所以我在过去的八个小时里一直在使用 Erlang,我花了两个时间用我的头敲击键盘试图找出我的控制台不断返回的异常错误。 我正在编写一个骰子程序来学习erlang。我希望它能够通过 erlang 解释器
当我编译以下模块时: -module(x). -export([inp/0]). f(X) -> g(X). g(X) -> error(X). inp() -> f(123)
我目前正在开发一个实时媒体服务器,它将允许普通消费者向我们发送实时视频。在我们当前的环境中,我们已经看到发送给我们的广播持续了几天,因此能够在不断开用户连接的情况下修复错误(或添加功能)的想法非常引人
我是一名优秀的程序员,十分优秀!