我试图用Simpy来模拟一些在城市电网中移动汽车的行为。然而,我在概念上遇到了一些问题,我想什么时候应该使用这样的东西
yield self.env.timeout(delay)或yield env.process(self.someMethod())相对于只调用self.someMethod()方法而言。
在非常理论的层面上,我理解yield语句和生成器是如何应用于可迭代的,但不太确定它们与Simpy的关系。
Simpy教程仍然相当密集。
例如:
class Car(object):
def __init__(self, env, somestuff):
self.env = env
self.somestuff = somestuff
self.action = env.process(self.startEngine()) # why is this needed? why not just call startEngine()?
def startEngine(self):
#start engine here
yield self.env.timeout(5) # wait 5 seconds before starting engine
# why is this needed? Why not just use sleep?
env = simpy.Environment()
somestuff = "blah"
car = Car(env, somestuff)
env.run()发布于 2017-03-23 08:51:31
看起来您还没有完全理解生成器/异步函数。我在下面对您的代码进行评论,希望它能帮助您了解正在发生的事情:
import simpy
class Car(object):
def __init__(self, env, somestuff):
self.env = env
self.somestuff = somestuff
# self.startEngine() would just create a Python generator
# object that does nothing. We must call "next(generator)"
# to run the gen. function's code until the first "yield"
# statement.
#
# If we pass the generator to "env.process()", SimPy will
# add it to its event queue actually run the generator.
self.action = env.process(self.startEngine())
def startEngine(self):
# "env.timeout()" returns a TimeOut event. If you don't use
# "yield", "startEngine()" returns directly after creating
# the event.
#
# If you yield the event, "startEngine()" will wait until
# the event has actually happend after 5 simulation steps.
#
# The difference to time.sleep(5) is, that this function
# would block until 5 seconds of real time has passed.
# If you instead "yield event", the yielding process will
# not block the whole thread but gets suspend by our event
# loop and resumed once the event has happend.
yield self.env.timeout(5)
env = simpy.Environment()
somestuff = "blah"
car = Car(env, somestuff)
env.run()https://stackoverflow.com/questions/42956208
复制相似问题