我正在尝试使用SimPy进行仿真。与开放系统不同,由于我的系统是封闭的,因此我需要立即生成恒定数量的实体(本例中为10)。因此,没有到达间隔的时间。
问题是,当我尝试在有或没有到达间隔时间的while循环中生成实体时,我没有收到错误。 (没有到达间隔时间,它当然不会停止运行,因为您知道,它会尝试在给定的运行时中生成尽可能多的代码)。下面的代码有效,但这不是我所需要的。
def customer_generator(self, env, resource1, resource2):
while True:
p = self.customer(env, resource1, resource2) # create a new customer
env.process(p) # start the simulation of the customer
但是当我尝试在for循环中生成它们以仅创建10个实体时,
def customer_generator(self, env, resource1, resource2):
for x in range(10):
p = self.customer(env, resource1, resource2) # create a new customer
env.process(p) # start the simulation of the customer
我收到此错误:“没有人不是发电机”。
File "C:\Users\Can\Anaconda3\lib\site-packages\simpy\events.py", line 310, in __init__
raise ValueError('%s is not a generator.' % generator)
ValueError: None is not a generator.
也许我缺少一个简单的细节。关于如何仅生成10个实体而不出现此错误的任何建议?
答案 0 :(得分:0)
如果我们深入研究SimPy\envents.py
(https://github.com/cristiklein/simpy/blob/9ac72fee4f079da331707bbdaf7e7cda929ded0b/src/simpy/events.py#L311)的来源,则会看到以下内容:
class Process(Event):
....
def __init__(self, env, generator):
if not hasattr(generator, 'throw'):
# Implementation note: Python implementations differ in the
# generator types they provide. Cython adds its own generator type
# in addition to the CPython type, which renders a type check
# impractical. To workaround this issue, we check for attribute
# name instead of type and optimistically assume that all objects
# with a ``throw`` attribute are generators (the more intuitive
# name ``__next__`` cannot be used because it was renamed from
# ``next`` in Python 2).
# Remove this workaround if it causes issues in production!
raise ValueError('%s is not a generator.' % generator)
看起来这部分代码可能会产生开发人员指出的错误。我无法追溯何时何地。建议遵循开发人员的指示和您的SimPy(remove this workaround
)副本中的C:\Users\Can\Anaconda3\lib\site-packages\simpy\events.py
答案 1 :(得分:0)
根据我对SIMPY概念的理解,您应该从过程中返回一些内容,例如env.timeout(1)或env.exit()
答案 2 :(得分:0)
您的客户类别是否有 env.process(<some customer process>)
作为其 init 方法的一部分?
如果是这样,那么您不需要在生成器中调用 env.process(p)
如果不是,那么您需要传递一个进程,而不是将对象传递给 env.process()
env.process(p.<some process>)
其中 <some process>
是产生事件的生成器