0

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

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

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

4

3 回答 3

2

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

于 2012-04-19T18:55:44.820 回答
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.

使用计时器和进程之间的消息传递,您可以强制您的工作流程。即,如果需要太多时间,则暂停一个,而另一个则继续工作。


尽管您的用例在问题中不是很清楚,但您也可以让两个(实际上更多)进程并行工作,而不必相互等待,并且在进程完成工作后也会收到通知。

于 2012-04-18T22:53:13.220 回答
0

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

如果 f2() 过早到达接收子句,它将自动暂停并等待消息到达(因此让 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 & Thompson (O'Reilly)的Erlang Programming一书。这本书非常详细地和很好的例子涵盖了你需要知道的关于消息传递和并发的所有内容。

于 2012-04-19T10:56:33.263 回答