我的 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可以显式毒化通道以关闭进程网络。出于某种原因,争吵 occam 这样做会污染关闭逻辑的代码,并且看起来不合逻辑。
所以问题是,是否有一种方法可以在不使用示例中的显式通道的情况下终止生产者control
进程?
编辑:
此邮件列表存档( Poison )中可能包含有关此主题的更多信息,这已经很老了(> 10 年)。所以问题仍然存在,从那时起有什么变化吗,或者这是在 occam-pi 中实现“进程终止”的最佳方式?