(nodeA@foo.hyd.com)8> spawn(nodeA@bar.del.com, tut, test, [hello, 5]).
我想在bar.del.com上生成一个进程,该进程没有文件系统访问foo.hyd.com(从我产生进程的地方),运行模块“tut”的子例程“test”。
有没有办法这样做,没有为nodeA@bar.del.com提供已编译的“tut”模块文件?
答案 0 :(得分:4)
您可以使用以下函数在远程节点加载模块而不提供文件本身:
load_module(Node, Module) ->
{_Module, Bin, Filename} = code:get_object_code(Module),
rpc:call(Node, code, load_binary, [Module, Filename, Bin]).
如code:load_binary/3
Filename
中所述,参数仅用于跟踪模块的路径,并且本地node_server不使用它指向的文件。
答案 1 :(得分:3)
我将您的问题解释为不希望将* .beams从您的文件系统复制到远程文件系统。
如果您只是在测试内容,可以使用erl shell中的nl(Mod)
调用在所有(当前)已知节点上加载模块。也就是那些出现在nodes()
。
这将发送代码并从内存副本加载它,它不会将其存储在远程文件系统中。
您也可以使用slave
模块启动远程节点。从服务器访问其主服务器的文件系统和代码服务器。当您调用test:tut/2
函数时,普通的自动加载将确保模块存在于从模块中。
答案 2 :(得分:0)
您可以将本地代码发送到远程节点:
> {Mod, Bin, File} = code:get_object_code(Module).
> rpc:call(RemoteNode, code, load_binary, [Mod, File, Bin]).