猿问

通过 Erlport 执行的函数停止响应

我正在写我的论文申请。我需要线性编程,但我的应用程序是用 Elixir 编写的,这实际上不是用于此类操作的语言。这就是为什么我决定使用 Erlport 作为 Elixir 依赖项,它能够将 Python 代码与 Elixir 连接起来。我还使用 Pulp 作为优化的 python 库。


Elixir 版本:1.10.4,Erlport 版本:0.10.1,Python 版本:3.8.5,PuLP 版本:2.3


我为 Elixir-Python 通信编写了这样一个模块,它利用 GenServer 作为 Elixir 和 Python 之间的主要“通信中心”:


defmodule MyApp.PythonHub do

  use GenServer


  def start_link(_) do

    GenServer.start_link(__MODULE__, nil, name: __MODULE__)

  end


  def init(_opts) do

    path = [:code.priv_dir(:feed), "python"]

          |> Path.join() |> to_charlist()


    {:ok, pid} = :python.start([{ :python_path, path }, { :python, 'python3' }])


    {:ok, pid}

  end


  def handle_call({:call_function, module, function_name, arguments}, _sender, pid) do

    result = :python.call(pid, module, function_name, arguments)

    {:reply, result, pid}

  end


  def call_python_function(file_name, function_name, arguments) do

    GenServer.call(__MODULE__, {:call_function, file_name, function_name, arguments}, 10_000)

  end


end

对 GenServer 本身的调用如下所示:


PythonHub.call_python_function(:diets, python_function, [products_json, meal_statistics_json, @min_portion, @max_portion, @macro_enhancement])

其中python_function是:calculate_meal_4,products_json和meal_statistic_json是包含所需数据的 json。


通过python3 Diets.py调用calculate_meal_4时,它启动了上面的python脚本,并带有一些示例,但是真实的(取自应用程序),数据一切正常 - 我几乎很快就得到了最小化的结果。通过 Elixir Erlport 调用 python 脚本时出现问题。看看打印的输出,我可以看出它似乎一直有效,直到


solved_model = model.solve()

叫做。然后脚本似乎冻结了,GenServer 最终达到了GenServer.call函数的超时。


我还测试了一个简单的 python 测试文件的调用:


def pass_var(a):

  print(a)

  return [a, a, a]

效果很好。


这就是为什么我现在真的很困惑,我正在寻求任何建议。遗憾的是我还没有发现什么。


富国沪深
浏览 103回答 1
1回答

收到一只叮咚

嗯,调用外部求解器可能会冻结该过程。鉴于您可以使用 elixir 执行 bash 脚本,您可以轻松地将 python 脚本更改为命令行可执行文件(我建议单击)。然后,您可以将输出写入.json或.csv文件,并在完成后使用 Elixir 将其读回。@click.group()def cli():    pass@cli.command()@click.argument('products_json', help='your array of products')@click.argument('diet_json', help='your dietary wishes')@click.option('--lower-bound', default=0, help='your minimum number of desired calories')@click.option('--upper-bound', default=100, help='your maximum number of desired calories')@click.option('--enhance', default=False, help="whether you'd like to experience our enhanced experience")def calculate_meal_4(products_json, diet_json, lower_boundary, upper_boundary, enhance):    passif __name__ == '__main__':    cli()然后您可以使用python3 my_file.py <products_json> <diet_json> ...等等来调用它。您甚至可以验证 JSON,然后直接返回解析后的数据。
随时随地看视频慕课网APP

相关分类

Python
我要回答