【问题标题】:What is the simplest way of terminating (poisoning) a producer process in occam?在occam中终止(毒化)生产者进程的最简单方法是什么?
【发布时间】:2014-04-23 13:30:13
【问题描述】:

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

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。一个完整的例子是可用的here

这很好用,我相信 infinite 循环在 CSP 中是 idiomatic。当我的消费算法完成时,问题就出现了。在这个example 中,一旦消费者完成,就会发生死锁。

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

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
:

A full working example is available here。这样做的问题是代码更不可读-我知道是主观的,但对软件工程很重要-与原始意图相比,原始意图令人费解。这似乎与奥卡姆剃刀原理相矛盾!

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

所以问题是,有没有一种方法可以终止生产者进程,而无需像the example 那样使用显式的control 通道?

编辑:

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

【问题讨论】:

    标签: occam-pi pi-calculus


    【解决方案1】:

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

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

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

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

    奥卡姆 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
    

    【讨论】:

    • 有趣的是,这确实消除了对黑洞进程的需要,但如前所述,增加了通信开销。我想这是一个权衡。答案基本上是,一个通道不能被明确地“中毒”,奥卡姆不支持通道中毒的概念,但是,生产者进程可以通过使用控制通道来控制。
    • 中毒是一种可以在 Occam 中应用的设计模式,但 AFAIK 没有明确的语言支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2023-03-31
    • 2010-09-23
    • 1970-01-01
    • 2019-04-20
    • 2020-10-16
    相关资源
    最近更新 更多