在Erlang中中断进程

在Erlang中中断进程,erlang,Erlang,我是新来的二郎。 我想知道是否可以中断erlang中的处理器。假设处理器x执行的函数f1()需要很长时间才能执行。我想找到一种有效的方法来中断处理器x以执行函数f2(),在执行f2()之后,它会返回到执行f1(),因为它被中断了 这样做的一种方法(虽然不是我想要的)是让处理器(命名为f1_proc)执行f1(),而f1_proc的创建者等待消息,如[中断、f1_终止等],如果接收到中断,则执行f2() 然而,这并不是我想要的。如果f2()依赖于f1(),该怎么办?在这种情况下,f1()被暂停,f

我是新来的二郎。 我想知道是否可以中断erlang中的处理器。假设处理器x执行的函数f1()需要很长时间才能执行。我想找到一种有效的方法来中断处理器x以执行函数f2(),在执行f2()之后,它会返回到执行f1(),因为它被中断了

这样做的一种方法(虽然不是我想要的)是让处理器(命名为f1_proc)执行f1(),而f1_proc的创建者等待消息,如[中断、f1_终止等],如果接收到中断,则执行f2()


然而,这并不是我想要的。如果f2()依赖于f1(),该怎么办?在这种情况下,f1()被暂停,f2()被执行,然后f1()应该从它开始停止。我知道我们可以终止一个进程,但我们可以暂停它们吗

考虑到您正在尝试使用erlang进程,我认为您的问题标题(处理器)有点误导

您应该尝试使用erlang。 直接从上面的文档链接:

Puts the calling process into a wait state where its memory allocation 
has been reduced as much as possible, which is useful if the process 
does not expect to receive any messages in the near future.
使用计时器和进程之间的消息传递,您可以强制执行工作流。 i、 e.如果需要花费太多时间,暂停其中一个,而另一个继续进行



尽管您的用例在这个问题上不是很清楚,但您也可以让两个(事实上更多)进程并行工作,而不必等待另一个进程,并且在一个进程完成其工作后得到通知。

一种方法是简单地在不同的进程中启动这两个功能。当f2()依赖于f1()的结果时,它将
接收带有所需数据的消息。当f1()计算完该数据后,它将其发送到f2()进程

如果f2()过早到达receive子句,它将自动暂停并等待消息到达(因此让f1()继续工作)。但是,如果先完成f1(),它将继续执行其他任务,直到Erlang进程调度器自动抢占

您还可以让f1()暂停,方法是让它等待来自f2()的消息。在这种情况下,请确保f1()在发送消息后等待,以避免死锁

例如:

f1(F2Pid) ->
   Data = ...,
   F2Pid ! {f1data, Data},
   ... continue other tasks ....

f2() ->
   ... do some work ...,
   Data = receive
             {f1data, F1Data} -> F1Data
          end,
   ... do some work with Data ....

main() ->
   F2Pid = spawn_link(?MODULE, f2, []),
   f1(F2Pid).
这种消息传递是Erlang编程模型的基础。你不需要发明同步或锁。只要收到一条消息,Erlang就会确保您收到该消息(并且只收到该消息)


我不知道您是如何学习Erlang的,但我推荐Cesarini&Thompson(O'Reilly)的《Erlang编程》一书。这本书非常详细地介绍了有关消息传递和并发性的所有知识,并提供了很好的示例。

您的问题的答案是“不”,这是不可能做到的。如果进程内部没有任何挂钩(例如,
receive
子句),就无法从“外部”暂停进程。

这不是我想要的。对不起,谢谢!答案应该是这样的。。(我会相信你的)。