2017-08-08 51 views
0

我試圖在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進程只能被定義爲只有一層?

回答

1

只有您致電interrupt()的過程中斷。要中斷第二個過程,您需要參考它:

如果要中斷當前活動的進程,請使用Environment.active_process來引用它。

如果您想明確地中斷第二個進程,請將ref存儲在shated名稱空間中的某處。

最後,您還可以捕獲進程1中的中斷並將其轉發給進程2。一個人可以繼續工作(如果願意的話)。