【发布时间】: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。这样做的问题是代码更不可读-我知道是主观的,但对软件工程很重要-与原始意图相比,原始意图令人费解。这似乎与奥卡姆剃刀原理相矛盾!
使用JCSP、C++CSP2 和python-csp 可以显式毒化通道以关闭进程网络。出于某种原因,争吵 occam 这样做会污染关闭逻辑的代码,并且似乎不合逻辑。
所以问题是,有没有一种方法可以终止生产者进程,而无需像the example 那样使用显式的control 通道?
编辑:
此邮件列表存档 (Poison) 中可能包含有关此主题的更多信息,这已经很老了(> 10 年)。所以问题仍然存在,从那以后有什么变化吗,或者这是在 occam-pi 中实现“进程终止”的最佳方式?
【问题讨论】:
标签: occam-pi pi-calculus