erlang 生成 python 实例时出现 erlang 错误,带有 erlport
erlang error when erlang spawning python instance, with erlport
我想弄清楚我可以从 erlang 创建多少 python instance/processe。
我设法创建了 500 个实例。
当创建所有进程时,cpu 接近 0%。
1 python 实例占用 6.2MB 内存。
400 python 个实例需要 2.4 GB 的内存。
500 python 个实例需要 3.1 GB 的内存。
当我尝试创建 600 python 个实例时,我得到了这个错误:
/usr/lib/erlang/erts-7.0/bin/child_setup: error while loading shared
libraries: libc.so.6: cannot open shared object file: Error 24
** exception error: no match of right hand side value {error,
{invalid_python,"/usr/bin/python"}}
in function spawn_python:spawn_python/2 (spawn_python.erl, line 10)
理论上我需要 6.2MB*600 = 3.7GB 的免费内存(我有)。
这是我使用的代码。
它需要 erlport : http://erlport.org/downloads/
%% 我是怎么测试的
spawn_python:spawn_python(100).
spawn_python:spawn_python(100).
spawn_python:spawn_python(100).
spawn_python:spawn_python(100).
spawn_python:spawn_python(100).
spawn_python:spawn_python(100).
ERROR here
%%%%%%%% spawn_python.erl %%%%%%%%%%%%
-module(spawn_python).
-export([spawn_python/1, spawn_python/2]).
%% spawn N python process
spawn_python(N) -> spawn_python(N, []).
spawn_python(0, PyProcPids) ->
PyProcPids;
spawn_python(N, PyProcPids) ->
{ok, PyPid} = python:start(),
PyProcPid = spawn(fun() -> python_loop(PyPid) end),
io:format("Started Erlang/Python process -- PyProcPid: ~p~n", [PyProcPid]),
spawn_python(N - 1, [PyProcPid | PyProcPids]).
python_loop(PyPid) ->
receive
{stop, From} ->
python:stop(PyPid),
From ! ok
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
每个生成的端口都需要一些管道进行通信。每个管道都使用文件描述符(其中两个,但一个很快关闭)并且可以打开多少文件描述符是有限制的。最大打开文件描述符的数量通过下划线 OS 设置(参见 POSIX.1-2001 中定义的 ulimit
系统调用或 shell 的 ulimit
命令对于类似 unix 的系统)。
我想弄清楚我可以从 erlang 创建多少 python instance/processe。
我设法创建了 500 个实例。 当创建所有进程时,cpu 接近 0%。
1 python 实例占用 6.2MB 内存。 400 python 个实例需要 2.4 GB 的内存。 500 python 个实例需要 3.1 GB 的内存。
当我尝试创建 600 python 个实例时,我得到了这个错误:
/usr/lib/erlang/erts-7.0/bin/child_setup: error while loading shared libraries: libc.so.6: cannot open shared object file: Error 24 ** exception error: no match of right hand side value {error, {invalid_python,"/usr/bin/python"}} in function spawn_python:spawn_python/2 (spawn_python.erl, line 10)
理论上我需要 6.2MB*600 = 3.7GB 的免费内存(我有)。
这是我使用的代码。 它需要 erlport : http://erlport.org/downloads/
%% 我是怎么测试的
spawn_python:spawn_python(100). spawn_python:spawn_python(100). spawn_python:spawn_python(100). spawn_python:spawn_python(100). spawn_python:spawn_python(100). spawn_python:spawn_python(100). ERROR here
%%%%%%%% spawn_python.erl %%%%%%%%%%%%
-module(spawn_python).
-export([spawn_python/1, spawn_python/2]).
%% spawn N python process
spawn_python(N) -> spawn_python(N, []).
spawn_python(0, PyProcPids) ->
PyProcPids;
spawn_python(N, PyProcPids) ->
{ok, PyPid} = python:start(),
PyProcPid = spawn(fun() -> python_loop(PyPid) end),
io:format("Started Erlang/Python process -- PyProcPid: ~p~n", [PyProcPid]),
spawn_python(N - 1, [PyProcPid | PyProcPids]).
python_loop(PyPid) ->
receive
{stop, From} ->
python:stop(PyPid),
From ! ok
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
每个生成的端口都需要一些管道进行通信。每个管道都使用文件描述符(其中两个,但一个很快关闭)并且可以打开多少文件描述符是有限制的。最大打开文件描述符的数量通过下划线 OS 设置(参见 POSIX.1-2001 中定义的 ulimit
系统调用或 shell 的 ulimit
命令对于类似 unix 的系统)。