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

How to interrupt nested processes in 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 的范围之外访问它。有没有一种方法可以导致中断以中断父进程中定义的所有正在进行的进程,或者 simpy 中的所有进程是否必须只定义一层深?

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

如果您想中断当前活动的进程,请使用 Environment.active_process 获取对它的引用。

如果您想显式中断第二个进程,请将其引用存储在共享命名空间中的某处。

最后还可以捕获进程一的中断,转发给进程二。处理一个可以继续工作(如果需要的话)。