Python SimPy:如何拆分或复制客户?

时间:2012-12-02 09:22:33

标签: python simulation simpy

以下是我在SimPy中尝试实现的内容:

客户首先进入服务器A进行5分钟的服务。然后将每个客户分成两个,一个到服务器B进行3分钟的服务,一个进入服务器C进行2分钟的服务。

我编写了以下代码,但它似乎无法根据输出工作。另外我不确定我使用复制功能的方式是否正确,因为我想拆分离开服务器A的每个客户,但我觉得我的代码可能只适用于第一个客户。

任何帮助将不胜感激。

from SimPy.Simulation import *
from copy import *

class Source(Process):                               
    def generate(self):                 
        for i in range(5):
            c = Customer(name="Customer%02d" % (i))  
            activate(c, c.runA())
            yield hold, self, 10                    

class Customer(Process):
    def runA(self):
        print("%7.4f %s (original) enters server A" % (now(), self.name))
        yield hold, self, 5
        print("%7.4f %s (original) leaves server A" % (now(), self.name))

        dup1 = copy(self)
        dup2 = copy(self)
        activate(dup1, dup1.runB())
        activate(dup2, dup2.runC())

    def runB(self):
        print("%7.4f %s (copy) enters server B" % (now(), self.name))
        yield hold, self, 3
        print("%7.4f %s (copy) leaves server B" % (now(), self.name))

    def runC(self):
        print("%7.4f %s (copy) enters server C" % (now(), self.name))
        yield hold, self, 2
        print("%7.4f %s (copy) leaves server C" % (now(), self.name))

initialize()
s = Source()                                         
activate(s, s.generate(), at=0.0)
simulate(until=100.0)

输出:

 0.0000 Customer00 (original) enters server A
 5.0000 Customer00 (original) leaves server A
10.0000 Customer01 (original) enters server A
15.0000 Customer01 (original) leaves server A
20.0000 Customer02 (original) enters server A
25.0000 Customer02 (original) leaves server A
30.0000 Customer03 (original) enters server A
35.0000 Customer03 (original) leaves server A
40.0000 Customer04 (original) enters server A
45.0000 Customer04 (original) leaves server A
logout

1 个答案:

答案 0 :(得分:0)

我担心复制Simpy Process并不是那么简单,我认为因为它们是生成器(see),并且因为它们为模拟保留了内部变量。

要使代码正常工作,您可以按如下方式修改RunA(self)。 在这里,我们创建了两个新的Process-Customers,它们看起来像self而不是复制它。

def runA(self):
    print("%7.4f %s (original) enters server A" % (now(), self.name))
    yield hold, self, 5
    print("%7.4f %s (original) leaves server A" % (now(), self.name))

    dup1 = Customer(name = self.name)
    dup2 = Customer(name = self.name)

    activate(dup1, dup1.runB())
    activate(dup2, dup2.runC())

这很有效,因为您只有一个要复制的变量。在更复杂的情况下,您可以使用use the var(Object)方法,但要注意Process类包含许多您可能不应复制的变量。

另外,我建议在SimPy上使用this tutorials来帮助您设计模拟。