我的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
。有一个完整的示例here。
这非常有用,我认为CSP中的infinite循环是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。问题在于代码更难以理解 - 我知道主观,但对于软件工程很重要 - 原始意图与原始意图相比是错综复杂的。这似乎与奥卡姆的剃刀相矛盾!
使用JCSP,C++CSP2和python-csp可以明确中毒通道,以关闭进程网络。由于某些原因,使用关闭逻辑来进行争论,这似乎是不合逻辑的。
所以问题是,是否存在一种终止生产者流程而不使用the example中明确的control
渠道的方法?
编辑:
此邮件列表存档(Poison)中可能包含有关此主题的更多信息,这已经很久了(> 10年)。所以这个问题仍然存在,从那以后发生了什么变化,或者这是在occam-pi中实现“流程终止”的最佳方式?
答案 0 :(得分:2)
所以问题是,是否存在一种在不使用显式控制通道的情况下终止生产者流程的方法?
只要终止决定来自生产者流程之外,除了使用(控制)渠道之外别无他法。这是因为在分布式存储器模型中,必须通过消息传递信息。
那就是说,你所指的中毒方法是一般方法,也可以在这种情况下使用。它污染解决方案的原因是原始(非终止)生产者进程仅发送消息,但不接收任何消息。为了使中毒方法起作用,生产者必须准备好接受信息,而且 - 更不方便的是 - 消费者必须准备好与缓慢的生产者打交道。
我会考虑使用不同的技术来解决问题:生成者会在每条消息发出后获得一个信号,无论消费者是否希望它继续。这将导致更多流量,但解决方案的结构更加清晰。
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