2017-12-30 7 views
0

Im folgenden Codeausschnitt versuche ich, das einfache Tutorial zu verstehen. Ich kann die Ausgabe nicht erklären. Ich erwarte, dass alle "\ o /" auf einmal gedruckt werden, bevor andere Anweisungen gedruckt werden. Außerdem gibt es ein Problem mit dem Rückruf.Ich kann den Ausführungsablauf im folgenden Code nicht verstehen. Nicht in der Lage, den Fehler sowie die Ausgabe zu erklären

import simpy 
    class School: 
    def __init__(self, env): 
     self.env = env 
     self.class_ends = env.event() 
     self.pupil_procs = [env.process(self.pupil()) for i in range(3)] 
     for x in self.pupil_procs: 
      x.callbacks.append(self.my_callback(x)) 
      #print(x.callbacks) 

     self.bell_proc = env.process(self.bell()) 

    def bell(self): 
     for i in range(2): 
      value=yield self.env.timeout(45,value="bell_rang!at"+str(env.now)) 
      self.class_ends.succeed(value='class_ends!') 
      print("in bell proc") 
      self.class_ends = self.env.event() 
      print(value) 


    def pupil(self): 
     for i in range(2): 
      print(' \o/',i, end=' ') 
      classends=yield self.class_ends 
      print('done!') 
      print(classends) 

    def my_callback(self,event): 
     print('Called back from',event) 


env = simpy.Environment() 
school = School(env) 
env.run() 

Die Ausgabe ist wie folgt:

Called back from <Process(pupil) object at 0x7fd7ddce97b8> 
Called back from <Process(pupil) object at 0x7fd7ddce9be0> 
Called back from <Process(pupil) object at 0x7fd7ddcad5f8> 
\o/ 0 \o/ 0 \o/ 0 in bell proc 
bell_rang!at0 
done! 
class_ends! 
\o/ 1 done! 
class_ends! 
\o/ 1 done! 
class_ends! 
\o/ 1 in bell proc 
bell_rang!at45 
done! 
class_ends! 
done! 
class_ends! 
done! 
class_ends! 
Traceback (most recent call last): 
    File "/home/deeplearning/PycharmProjects/python-scheduling/learnSimPy/learnmore.py", line 35, in <module> 
    env.run() 
    File "/usr/local/lib/python3.5/dist-packages/simpy/core.py", line 137, in run 
    self.step() 
    File "/usr/local/lib/python3.5/dist-packages/simpy/core.py", line 221, in step 
    callback(event) 
TypeError: 'NoneType' object is not callable 

Process finished with exit code 1 
+0

Beachten Sie, dass Sie in '__init__' tatsächlich * aufrufen *' self.my_callback' und den Rückgabewert an 'callbacks' anhängen. Aber 'self.my_callback' gibt keinen Wert zurück, daher erhalten Sie eine Liste von' None' Werten. –

+0

Nichts ist in Ordnung, aber warum der Fehler? – kosmos

+0

Wenn Sie einen Fehler erhalten, bearbeiten Sie Ihre Frage, um das Traceback hinzuzufügen. –

Antwort

0

Sie fügen das Ergebnis self.my_callback(x) in die Liste der Rückrufe (die None ist).

Stattdessen sollten Sie functools.partial(self.my_callback, x) anhängen.

Ich empfehle auch, dass Sie lieber yield from process statt Funktionen an process Callbacks anhängen.

Verwandte Themen