pi演算-在occam中终止(中毒)生产者过程的最简单方法是什么



我的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
:

这里提供了一个完整的工作示例。这样做的问题是,代码更不可读——我知道,这是主观的,但对软件工程来说很重要——与原始意图相比,原始意图是复杂的。这似乎与奥卡姆剃刀相矛盾!

使用JCSP、C++CSP2和python-csp,可以显式地破坏通道以关闭进程网络。出于某种原因,这样做的争论会用关闭逻辑污染代码,而且似乎不合逻辑。

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

编辑:

这个邮件列表档案(毒药)中可能包含更多关于这个主题的信息,这已经很旧了(>10年)。因此,问题仍然存在,从那以后有什么变化吗?或者这是在occam pi中实现"过程终止"的最佳方式吗?

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

只要终止的决定源于生产者流程之外,就没有其他方法,只能使用(控制)通道。这是因为在分布式内存模型中,信息必须通过消息进行通信。

也就是说,你所说的投毒方法是一种通用方法,在这种情况下也可以使用。它污染解决方案的原因是原始(非终止)生产者进程只发送消息,而不接收任何消息。为了让投毒方法发挥作用,生产者必须准备好接受信息,更不方便的是,消费者必须准备好与行动迟缓的生产者打交道。

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

Occam 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

最新更新