2011-11-28 3 views
1

Helo, 저는 SimPy에서 비교적 복잡한 Discrete Event Simulation 모델을 만들고 있습니다.Python, SimPy : 함수 내에서 yield 사용하기

내 yield 문을 함수에 넣으려고하면 프로그램이 작동하지 않는 것 같습니다. 아래는 예를 보여줍니다.

0 activate <Klaus > at time: 1.0 prior: False 
1.0 hold <Klaus> delay: 2.0 
3.0 <Klaus > terminated 

holdLong()와 holdShort 방법은 전혀 작동하지 않았다

import SimPy.SimulationTrace as Sim 
import random 

## Model components ## 
class Customer(Sim.Process): 
    def visit(self): 
     yield Sim.hold, self, 2.0 
     if random.random()<0.5: 
      self.holdLong() 
     else: 
      self.holdShort() 

    def holdLong(self): 
     yield Sim.hold, self, 1.0 
     # more yeild statements to follow 

    def holdShort(self): 
     yield Sim.hold, self, 0.5 
     # more yeild statements to follow 

## Experiment data ## 
maxTime = 10.0 #minutes 

## Model/Experiment ## 
#random.seed(12345) 
Sim.initialize() 
c = Customer(name = "Klaus") #customer object 
Sim.activate(c, c.visit(), at = 1.0) 
Sim.simulate(until=maxTime) 

내가 이것을 실행에서 얻을 출력이다. 이 문제를 어떻게 해결할 수 있습니까? 미리 감사드립니다.

답변

6

생성기 함수를 호출하면 반복 할 수있는 생성기 개체가 반환됩니다. 이 반환 값을 단순히 무시하고 있으므로 아무 일도 일어나지 않습니다. 대신 생성자를 반복하고 모든 값을 다시 산출해야합니다.

+1

파이썬 3.3의 새로운 'yield from'구문이 여기 유용 할 것 같습니다. – jomido

1

파이썬에서는 yield를 함수 호출을 통해 위쪽으로 전파 할 수 없습니다. visit을 다음과 같이 변경하십시오 :

def visit(self): 
    yield Sim.hold, self, 2.0 
    if random.random()<0.5: 
     for x in self.holdLong(): 
      yield x 
    else: 
     for x in self.holdShort(): 
      yield x 
관련 문제