“ ValueError:无不是生成器。”在SimPy生成器函数中

时间:2019-12-13 15:19:59

标签: python generator simulation simpy

我正在尝试使用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个实体而不出现此错误的任何建议?

3 个答案:

答案 0 :(得分:0)

如果我们深入研究SimPy\envents.pyhttps://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> 是产生事件的生成器