2017-12-30 26 views
0

次のコードスニペットでは、simpyチュートリアルを理解しようとしています。私は出力を説明することができません。私はすべての "\ o /"が他のステートメントが印刷される前に一度に印刷されることを期待しています。また、コールバックに問題があります。次のように次のコードで実行フローを理解できません。エラーと出力を説明できません

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() 

出力は次のようになります。

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

'__init__'では、実際には' self.my_callback'を呼び出して、 'callbacks'に戻り値を追加することに注意してください。しかし 'self.my_callback'は値を返さないので、' None'値のリストを取得します。 –

+0

何も問題ありませんが、なぜそのエラーですか? – kosmos

+0

エラーが発生した場合は、質問を編集してトレースバックを追加してください。 –

答えて

0

あなたはコールバックのリストに(Noneです)self.my_callback(x)の結果を追加します。

代わりに、functools.partial(self.my_callback, x)を追加する必要があります。

私はまた、あなたがむしろprocessのコールバックに代わりアペンド機能のyield from processを使用することをお勧めします。

関連する問題