2017-08-08 3 views
0

Ich versuche, eine Reihe von verschachtelten Prozessen in Simpy zu unterbrechen. Aus dem folgenden Code geht hervor, dass nur die erste Prozessschicht durch ein Interrupt-Ereignis unterbrochen wird. Ich kann keinen Weg finden, die Prozesse innerhalb eines anderen Prozesses von außerhalb des äußeren Prozesses zu referenzieren, um sie zu unterbrechen. Im Folgenden finden Sie ein Minimum reproduzierbares Beispiel:Wie verschachtelte Prozesse in SimPy zu unterbrechen?

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) 

Verfahren ein, wie es sollte unterbrochen wird, sondern Prozess zwei auf dem Geschäft weiter. Wenn ich env.process(process_two) einer Variablen innerhalb process_one zuweisen, kann ich nicht außerhalb des Bereichs von process_one darauf zugreifen. Gibt es eine Möglichkeit, eine Unterbrechung zu verursachen, um alle laufenden Prozesse zu unterbrechen, die in einem übergeordneten Prozess definiert sind, oder müssen alle Prozesse in simpy nur eine Schicht tief definiert sein?

Antwort

1

Nur der Prozess, bei dem Sie interrupt() aufrufen, wird unterbrochen. Um den zweiten Prozess zu unterbrechen, benötigen Sie einen Verweis darauf:

Wenn Sie den derzeit aktiven Prozess unterbrechen möchten, verwenden Sie Environment.active_process, um einen Verweis darauf zu erhalten.

Wenn Sie den zweiten Prozess explizit unterbrechen möchten, speichern Sie einen Verweis darauf irgendwo in einem Shated-Namespace.

Schließlich können Sie auch den Interrupt in Prozess 1 abfangen und an Prozess zwei weiterleiten. Prozess kann man als weiterarbeiten (wenn es will).

Verwandte Themen