以下是我在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
答案 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来帮助您设计模拟。