Erlang 使进程在超时之前结束

Erlang 使进程在超时之前结束,erlang,otp,Erlang,Otp,看起来erlang进程将保持活动状态,直到5秒的默认超时,即使它已经完成了它的工作 我有一个gen_server调用,它向window CLI发出一个命令,该命令可以在不到1秒的时间内完成,但进程将等待5秒,然后我才能看到操作结果。发生什么事?这与超时有关,或者是其他原因 编辑此呼叫在5秒钟内不会执行任何操作(默认超时!) 您仍然没有添加有关问题所在的任何信息。但是我看到一些我想评论的事情 当前工作目录 您正在使用file:set_cwd(Path),因此启动的命令将继承该路径。文件服务器的cw

看起来erlang进程将保持活动状态,直到5秒的默认超时,即使它已经完成了它的工作

我有一个gen_server调用,它向window CLI发出一个命令,该命令可以在不到1秒的时间内完成,但进程将等待5秒,然后我才能看到操作结果。发生什么事?这与超时有关,或者是其他原因

编辑此呼叫在5秒钟内不会执行任何操作(默认超时!)


您仍然没有添加有关问题所在的任何信息。但是我看到一些我想评论的事情

当前工作目录 您正在使用
file:set_cwd(Path)
,因此启动的命令将继承该路径。文件服务器的cwd是全局的。您可能根本不应该在应用程序代码中使用它。这对于将cwd设置为希望写入erlang崩溃转储的位置非常有用

您希望让rail根据
Path
使用cwd执行,这样做更好:

_ ->
    Response = os:cmd(string:join(["cd", Path, "&&", "Rails", Name, Args], " ")),
    {reply, Response, State}
也就是说,启动一个shell来解析命令行,让shell更改cwd和启动Rails

阻止gen_服务器 gen_服务器用于序列化处理。也就是说,它处理一条又一条消息。它不会同时处理所有这些问题。它存在的理由是不同时处理它们

您(相对于其他成本)正在gen_服务器中进行一些非常昂贵的计算:启动运行此rails应用程序的外部进程。您是否打算一次最多运行一个rails应用程序?(我听说RubyonRails每个进程需要大量内存,所以这可能是一个明智的决定)

如果您不需要使用昂贵调用中的任何值来更新状态,如示例代码中所示,那么您可以使用显式gen_server:reply/2调用

_ ->
    spawn_link(fun () -> rails_cmd(From, Path, Name, Args) end),
    {no_reply, State}
然后你有

rails_cmd(From, Path, Name, Args) ->
    Response = os:cmd(string:join(["cd", Path, "&&", "Rails", Name, Args], " ")),
    gen_server:reply(From, Response).

我猜os:cmd需要很长时间才能返回结果。可能os:cmd在判断rails命令何时完成时遇到问题,并且在进程触发超时之前不会返回。但是从你的代码来看,最有可能的罪魁祸首是os:cmd调用


返回的内容是否包含您期望的所有内容?

您能否发布一些示例代码来演示问题?请确保已启动sasl(应用程序:start(sasl)),以便获得良好的错误报告。感谢您的回答,它对我学习erlang的过程有很大帮助。然而,我尝试了你关于使用gen_server:reply/2的建议,它似乎没有给我任何不同。我不明白目的。我很高兴这个操作是同步的(我想在做任何其他事情之前等待它完成),但它返回的时间似乎比实际的Rails操作要长。在我看来,Rails操作正在执行,比如说在2秒内,但直到gen_服务器在5秒后超时,我才看到结果。我认为默认超时是5秒,对吗?对不起,如果我在这里太笨了,但是我3天前才开始学习erlang,非常感谢我能得到的所有帮助。我不确定你没有更快地看到结果是erlangs的错。超时不应导致erlang进程花费更长的时间返回。我猜您的rails命令需要更长的时间,或者rails命令的结果需要更长的时间才能由erlang返回。您是否尝试过运行一个只返回而不执行任何操作的普通流程?我打赌你的车不会减速。该死!你是对的,这是Rails的错,5秒钟的事情让我困惑是的,返回的正是我所期望的(创建的文件列表),我同意它一定是os:cmd调用,因为普通进程几乎是瞬时返回的。我知道你已经回答了我的问题,我当时很愚蠢。我想这就是熬夜到凌晨3点,学习一门新语言对你的好处。但是你从错误中学到了很多,我也从你们的答案中学到了很多,谢谢,没问题。相信我,我也犯过愚蠢的错误。就像你说的,这是我们学习的一部分。
rails_cmd(From, Path, Name, Args) ->
    Response = os:cmd(string:join(["cd", Path, "&&", "Rails", Name, Args], " ")),
    gen_server:reply(From, Response).