为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

富国沪深 2023-10-31 14:33:44
我正在写我的论文申请。我需要线性编程,但我的应用程序是用 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)  endend对 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]效果很好。这就是为什么我现在真的很困惑,我正在寻求任何建议。遗憾的是我还没有发现什么。
查看完整描述

1 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

嗯,调用外部求解器可能会冻结该过程。

鉴于您可以使用 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):

    pass


if __name__ == '__main__':

    cli()

然后您可以使用python3 my_file.py <products_json> <diet_json> ...等等来调用它。

您甚至可以验证 JSON,然后直接返回解析后的数据。


查看完整回答
反对 回复 2023-10-31
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信