gpt4 book ai didi

python - Simpy - 何时使用 yield 以及何时调用函数

转载 作者:太空宇宙 更新时间:2023-11-04 10:02:10 25 4
gpt4 key购买 nike

我正在尝试使用 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()

最佳答案

看起来你没有完全理解生成器/异步功能还没有。我在下面评论您的代码,希望对您有所帮助你了解发生了什么:

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

关于python - Simpy - 何时使用 yield 以及何时调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42956208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com