- 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/
1.使用start-all.sh启动hadoop服务时,提示输入 您确定要继续连接吗(是/否) 当我通过脚本启动它时如何抑制这个提示,现在我正在使用期望模块,但我认为可能有一种更简单的方法来做到这一点
我安装了在 Ubuntu 12.04 下运行的 Geonode R 2.01。我尝试使用以下命令卸载它: sudo apt-get remove --purge geonode sudo apt-ge
假设我有 AppDomainA,它启动 AppDomainB。 AppDomainB 然后启动 AppDomainC。 如果在 AppDomainA 中卸载 AppDomainB,AppDomainC
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我尝试使用以下命令从我的 Ubuntu 中卸载 NGinX: sudo apt-get remove nginx-core nginx-full nginx-light nginx-extras n
我已经从 /Applications/ 中删除了 MacVim目录,但当我输入 vim 时在终端中显示错误:no such file or directory: /Applications/MacVi
我的页面中有一个 iframe,该 iframe 嵌入了一个不在我的服务器上的网站。 我正在寻找一种在 iframe 重定向之前触发函数的方法。例如,当用户单击 iframe 内的链接并且 ifram
看来我被 Visual Studio 的 Atomineer Pro 文档加载项挟持了!试用期结束了,我没有用了!但现在每次我在 Visual Studio 中做某事时,我都会收到一条错误消息并发送到
我有一个使用 WiX 完成的安装程序。安装完成后,它会启动一个应用程序,在 Explorer 进程中注入(inject)一些代码。 目前,当我卸载时,重新启动管理器会启动并关闭我的应用程序和资源管理器
在我的网络应用中,我需要在用户离开页面之前发送他们更改的最新数据。 我在页面卸载时调用这样的函数: window.onbeforeunload=sendData; 这就是函数内部调用的内容 funct
我使用 jQuery 和 history.js 来管理部分页面之间的动态转换;这样我就可以避免重新加载整个文档。其中一些部分页面调用自己独特的 javascript 文件。虽然页面之间的转换运行良好,
我需要处理应用程序包的变化,我这样写我的 mainfest mainfest.xml 我的接收器类
我目前在使用大量内存方面遇到了麻烦,我正在尽一切努力削减和优化涉及内存的代码...目前我的游戏的大部分 Nib 文件都加载了所有它在 ViewDidLoad 中的变量,现在我的问题是,在我的 view
如何从系统中删除 composer Php Dependecny Manager? 它说卸载无法继续,因为以下应用程序正在使用需要删除的文件。 Windows 资源管理器 最佳答案 我遇到了同样的问题
所以我使用 stow 在服务器上安装了 Python 2.7.1 源代码 .我过去很粗心,在处理源代码安装时我试图保持井井有条。所以,输入 stow。现在我使用 wget 安装了 easy_insta
有谁知道如何卸载 MacRuby?我在使用 RubyCocoa 然后决定试用 MacRuby,在安装 MacRuby 之后,RubyCocoa 已经停止工作。所以我想删除 MacRuby,但我找不到任
我无法从 64 位 EC2 卸载 mongo。在/usr/bin 我有 mongo 和 mongod 等等。当我从任何地方键入 mongo 时,它会在 1.8 版打开 shell。我现在下载了 2.0
本文实例讲述了Android编程实现监控apk安装,卸载,替换的方法。分享给大家供大家参考,具体如下: ?
1说明 mysql++是mysql开发团队为OO编程提供的C++开发库,是对mysql提供的底层数据存取API进行的C++封装,用其手册上的说法是:复杂而又庞大,当然功能也更强大。 Mysql+
自从我开始建立我的网站那天起,我安装了很多包,有时是为了测试一堆代码,有时是为了项目本身(后来我发现这不是需要的包)。但是现在,当我运行 pip freeze 时,我有一个包列表,我很难卸载不使用的包
我是一名优秀的程序员,十分优秀!