Skip to main content
 首页 » 编程设计

python ,SimPy : Using yield inside functions

2025年05月04日16zhujiabin

Helo,我正在 SimPy 中构建一个相对复杂的离散事件模拟模型。

当我尝试将 yield 语句放入函数中时,我的程序似乎无法运行。下面显示了一个示例。

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) 

我运行它得到的输出是:

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

holdLong() 和 holdShort 方法似乎根本不起作用。我怎样才能解决这个问题?提前致谢。

请您参考如下方法:

调用生成器函数会返回一个可以迭代的生成器对象。您只是忽略了这个返回值,所以什么也没有发生。相反,您应该遍历生成器并重新生成所有值:

class Customer(Sim.Process): 
    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