如何在SimPy中中断嵌套进程?

时间:2017-08-08 19:34:45

标签: python simpy

我试图在simpy中断一组嵌套进程。从下面的代码看来,只有第一层进程被中断事件中断,我似乎无法找到一种方法来引用外部进程外部的另一个进程中定义的进程,以便中断它们。以下是最低可重复的示例:

import simpy

env = simpy.Environment()

def process_one():
    try:
        yield env.timeout(5)
        print("inside process one")
        yield env.process(process_two())
        yield env.timeout(10)
    except simpy.Interrupt:
        print("interrupted at ", env.now)

def process_two():
    try:
        yield env.timeout(5)
        print("inside process two")
        yield env.timeout(5)
        print("finishing process two")
    except simpy.Interrupt:
        print("process two interrupted at", env.now)

process = env.process(process_one())


def interruption(time):
    yield env.timeout(time)
    process.interrupt()

env.process(interruption(6))

env.run(until=30)

进程一被中断,但进程二继续其业务。如果我将env.process(process_two)分配给process_one内的变量,则无法从process_one范围之外访问该变量。有没有办法导致中断来中断父进程中定义的所有正在进行的进程,或者是否只需要在一层深度定义所有进程?

1 个答案:

答案 0 :(得分:2)

只有您调用interrupt()的进程才会被中断。要中断第二个过程,您需要引用它:

如果您想中断当前有效的流程,请使用Environment.active_process获取参考号。

如果要显式中断第二个进程,请在一个带有shated命名空间的地方存储一个ref。

最后,您还可以在进程1中捕获中断并将其转发到进程2。过程一可以继续工作(如果它想)。