2017-08-08 22 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) 

プロセス1は中断されますが、プロセス2は業務を継続します。 env.process(process_two)process_oneの変数に代入すると、process_oneの範囲外にアクセスすることはできません。親プロセス内で定義されているすべての進行中のプロセスを中断させたり、simpy内のすべてのプロセスを1つの深い層だけ定義しなければならない方法がありますか?

答えて

1

interrupt()を呼び出すプロセスだけが中断されます。

現在アクティブなプロセスを中断する場合は、Environment.active_processを使用して参照を取得してください。

明示的に2番目のプロセスを中断したい場合は、shated名前空間のどこかにrefを格納します。

最後に、プロセス1の割り込みを捕捉してプロセス2に転送することもできます。プロセス1は、(必要な場合)作業を続けることができます。

関連する問題