在Erlang中中断进程

时间:2012-04-18 22:32:07

标签: erlang

我是erlang的新手。 我想知道是否有可能在erlang中断处理器。假设我们让处理器x执行一个需要很长时间才能执行的函数f1()。我想找到一种有效的方法来中断处理器x以执行函数f2(),并且在执行f2()之后它返回执行f1()从中断。

这样做的一种方法(尽管不完全是我想要的)是让f1()由处理器(名称为f1_proc)执行,而f1_proc的创建者则等待[interrupt,f1_terminated等消息] ..]如果接收到中断,则执行f2()。

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

3 个答案:

答案 0 :(得分:2)

你的问题的答案是否定的,这是不可能做到的。在进程内没有任何钩子(例如receive子句)的情况下,无法从“外部”暂停进程。

答案 1 :(得分:0)

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

您应该尝试使用erlang hibernate command。 直接来自上面的文档链接:

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.

在进程之间使用计时器和消息传递可以强制您的工作流程。 即如果花费太多时间暂停一个,而其他人继续这样做。


虽然你的用例在问题中并不是那么清楚,但你也可以让两个(实际上更多)进程并行工作,而不必等待彼此,并且一旦进程完成它的工作就会得到通知。

答案 2 :(得分:0)

一种方法是简单地在不同的进程中启动两个函数。当f2()依赖于f1()的结果时,receive是包含所需数据的消息。当f1()完成计算数据时,它将它发送到f2()进程。

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

您也可以通过让f1()等待来自f2()的消息来暂停f1()。在这种情况下,请确保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& amp;的推荐书 Erlang Programming 。汤普森(奥莱利)。本书详细介绍了有关消息传递和并发性的所有信息,并提供了很好的示例。