2012-04-18 45 views
0

我是erlang的新手。 我想知道是否有可能在erlang中中断处理器。假设我们有处理器x执行需要很长时间执行的函数f1()。我想找到一个有效的方法来中断处理器x来执行函数f2(),并且在执行f2()之后,它会返回执行f1(),从而中断它。 (虽然不是我想要的)的一种方法是让f1()由处理器执行(名称为f1_proc),而f1_proc的创建者等待消息,如[interrupt,f1_terminated,等。]如果接收到中断f2()被执行。在Erlang中断进程

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

回答

2

回答你的问题是没有,这无法做到的。如果没有任何挂钩(例如receive子句),则无法暂停“外部”进程。

+0

谢谢!这是应该如何回答..(我会相信你的)。 – AJed 2012-04-19 22:11:42

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. 

使用定时器和信息流程之间传递你可以强迫你的工作流程。 即暂停一个,如果它需要太多时间,而其他人继续这样做的工作。


虽然你的使用情况是不是在这个问题很清楚,你还可以兼得(INFACT更多)处理并行工作,而无需等待彼此,也收到通知,一旦一个进程已经完成了它的工作。

+0

这不是我要找的。对不起 – AJed 2012-04-19 03:56:50

0

一种方式来做到这一点是根本不同的进程启动这两个功能。当f2()取决于f1()的结果时,它是带有所需数据的消息。当f1()完成计算数据时,它将它发送到f2()进程。

如果F2()过早地到达接受条款,它会自动暂停,等到消息到达(因此让F1()继续开展工作)。但是,如果f1()首先完成,它将继续执行其他任务,直到Erlang进程调度程序自动抢占为止。

您还可以通过让它等待消息从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将确保您获得该消息(以及该消息)。

我不知道你是怎么学习的二郎山,但我通过利尼&汤普森(O'Reilly)的建议书Erlang编程。本书详细介绍了一些很好的示例,您需要了解消息传递和并发性。