1

我试图弄清楚erlang可以创建多少个python实例/进程。当erlang产生python实例时erlang错误,erlport

我管理创建500个实例。 当所有进程创建时,cpu接近0%。

1 python实例需要6.2MB的ram。 400 python实例需要2.4 GB的内存。 500 python实例需要3.1 GB的内存。

当我尝试创建600蟒蛇例如我得到这个错误:

/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.7 GB的可用RAM(我让他们)的。

这是我使用的代码。 它需要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. 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
+1

在irc,ulimit -n 2048的帮助下解决(增加fd限制) –

回答

4

每个催生端口需要一些管道与沟通。每个管道使用文件描述符(其中两个,但一个很快关闭),并且有多少文件描述符可以打开。最大打开文件描述符的数量由下划线OS设置(请参见POSIX.1-2001中定义的ulimit系统调用或用于unix类似系统的shell的ulimit命令)。