【问题标题】:erlang error when erlang spawning python instance, with erlporterlang生成python实例时出现erlang错误,带有erlport
【发布时间】:2015-11-15 15:50:53
【问题描述】:

我试图弄清楚我可以从 erlang 创建多少个 python 实例/进程。

我设法创建了 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:加载共享时出错 库:libc.so.6:无法打开共享对象文件:错误 24 ** 异常错误:右侧值不匹配 {error, {invalid_python,"/usr/bin/python"}} 在函数 spawn_python:spawn_python/2(spawn_python.erl,第 10 行)

理论上我需要 6.2MB*600 = 3.7 GB 的可用内存(我得到了)。

这是我使用的代码。 它需要 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)。 这里有错误

%%%%%%%% 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.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

【问题讨论】:

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

标签: python concurrency parallel-processing erlang runtime-error


【解决方案1】:

每个生成的端口都需要一些管道进行通信。每个管道都使用文件描述符(其中两个,但一个即将关闭),并且您可以打开多少文件描述符是有限制的。最大打开文件描述符的数量通过在 OS 下划线来设置(参见 POSIX.1-2001 中定义的ulimit syscall 或类似 unix 系统的 shell 的ulimit 命令)。

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 2014-09-17
    • 2016-06-21
    • 2016-07-24
    • 1970-01-01
    • 2019-02-06
    • 2013-09-17
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多