3

我的 occam-pi 应用程序有一个长时间运行的生产者进程,定义如下:

PROC producer (VAL INT start, step, CHAN OF INT c!)
  INT count:
  SEQ
    count := start
    WHILE TRUE
      SEQ
        c ! count
        count := count + step
:

它在通道上发送一个c从 增加start的值step此处提供了完整示例。

这很好用,我被引导相信无限循环在 CSP中是惯用的。当我的消费算法完成时,问题就出现了。在此示例中,一旦消费者完成,就会发生死锁。

这里描述的TAGGED.INT协议试图解决关闭进程网络的问题,但是,根据我目前的理解,没有简单的方法可以终止主要工作是在通道上发送的生产者。感觉停止生产者的唯一方法是使用某种控制通道并黑洞输出:

PROTOCOL CONTROL
  CASE
    poison
:

PROTOCOL TAGGED.INT
  CASE
    normal; INT
    poison
:

PROC producer (VAL INT start, step, CHAN OF TAGGED.INT c!, CHAN OF CONTROL control?)
  INT count:
  INITIAL BOOL running IS TRUE:
  SEQ
    count := start
    WHILE running
      SEQ
        PRI ALT
          control ? poison
            SEQ
              running := FALSE
              c ! poison      -- necessary, only to kill the black hole process 
          SKIP
            SEQ
              c ! normal; count
              count := count + step
:

此处提供了完整的工作示例。这样做的问题是代码更加不可读-我知道是主观的,但对软件工程很重要-与原始意图相比,原始意图令人费解。这似乎与奥卡姆剃刀原理相矛盾!

使用JCSPC++CSP2python-csp可以显式毒化通道以关闭进程网络。出于某种原因,争吵 occam 这样做会污染关闭逻辑的代码,并且看起来不合逻辑。

所以问题是,是否有一种方法可以在不使用示例中的显式通道的情况下终止生产者control进程?

编辑:

此邮件列表存档( Poison )中可能包含有关此主题的更多信息,这已经很老了(> 10 年)。所以问题仍然存在,从那时起有什么变化吗,或者这是在 occam-pi 中实现“进程终止”的最佳方式?

4

1 回答 1

2

所以问题是,是否有一种方法可以在不使用示例中的显式控制通道的情况下终止生产者进程?

只要终止的决定源自生产者进程之外,除了使用(控制)通道之外别无他法。这是因为在分布式内存模型中,信息必须通过消息进行通信。

也就是说,你所说的中毒方法是一种通用方法,在这种情况下也可以使用。它污染解决方案的原因是原始(非终止)生产者进程仅发送消息,但不接收任何消息。为了使毒化方法起作用,生产者必须准备好接受消息,而且 - 更不方便的是 - 消费者必须准备好应对缓慢的生产者。

我会考虑使用不同的技术来解决这个问题:生产者会在每条消息发送后收到一个信号,无论消费者是否希望它继续。这会导致更多的流量,但这样解决方案的结构会更清晰。

奥卡姆 2.1 代码:

PROC producer( VAL INT start, step, CHAN INT data, CHAN BOOL control)
  BOOL running:
  INT  count:
  SEQ
    count, running := start, TRUE
    WHILE running
      SEQ
        data    ! count
        control ? running
        count := count + step
: -- producer

PROC main( CHAN BYTE inp, out, err)
  CHAN INT data:
  CHAN BOOL control:
  VAL INT amount IS 10:
  INT val:
  PAR
    producer( 0, 4, data, control)
    SEQ n= 1 FOR amount
      SEQ
        data    ? val
        control ! n < amount
        out.int( val, 0, out)
        out.string( "*n", 0, out)
: -- main
于 2014-05-19T10:00:09.567 回答