gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:50:13 25 4
gpt4 key购买 nike

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

它在 channel c 上发送一个值,该值从 start 增加 step。提供完整示例 here .

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

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

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 .这样做的问题是代码更难读 - 我知道是主观的,但对软件工程很重要 - 与原始意图相比,原始意图是令人费解的。这似乎与奥卡姆 Razor 原则矛盾!

JCSP , C++CSP2python-csp为了关闭进程网络,可以显式中毒 channel 。出于某种原因,争吵 occam 这样做会污染带有关闭逻辑的代码并且看起来不合逻辑。

所以问题是,是否有一种方法可以在不使用显式 control channel 的情况下终止生产者进程,如 the example

编辑:

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

最佳答案

So the question is, is there a method of terminating a producer process without the use of an explicit control channel as in the example?

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

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

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

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

关于occam-pi - 在 occam 中终止(中毒)生产者进程的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23245906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com