我想进行模拟,其中服务时间取决于某些功能的计算复杂性。
由于功能处理,请求到达不应该停止。 为了测试,我使用了使用cpu几秒钟的示例函数:
sorted([float(random.random()) for i in range(1000000)])
如何调用它来模拟服务,但不要阻止新的服务请求到达。如果我调用此函数,则新的服务请求在函数执行后到达,而不是在指定的时间到达。
def visit(self, timeAtNAT, res):
arrive=time.clock()-startTime
print("%7.4f. Packet #%s arrived." % (time.clock()-startTime, self.name))
yield request, self, res
wait = time.clock()-startTime - arrive
print("%7.4f. Packet #%s waited %6.3f" % (time.clock()-startTime, self.name, wait))
sorted([float(random.random()) for i in range(1000000)])
yield release, self, res
print("%7.4f. Packet #%s left" % (time.clock()-startTime, self.name))
因此,在我的示例中,新数据包仅在之前的数据包被丢弃后才到达。
我尝试使用multiprocessing
,但我得到了命名冲突(Process
类)。
我是SimPy,并行编程和Python的新手。
答案 0 :(得分:0)
我认为你在这里混合方法,如果你正在模拟复杂的计算 - 你实际上并没有做复杂的计算 - 你做了一个计算时间量级的算法计算将采取,然后添加一些随机抖动(即将其改变+/- 5%或其他)。
SimPy是一个离散事件仿真框架 - 意味着所有计算在仿真时间内有效地发生,因为仿真不会转移到下一个事件(并在模拟时间向前移动,继续下一个事件< em>必须发生 - {虽然转移到下一个事件并不意味着在模拟时间内向前移动,因为下一个事件可能同时发生})。
让我们制作这个计算复杂计算所用时间的算法。让它成为一个指数复杂度的算法,即大O表示法:O(2 n )
def calculateComputationComplexity(self, cValue):
#lets make this an exponential algorithm
algorithmTime = 0
if cValue < 17:
algorithmTime = 2**cValue
else:
algorithmTime = 2**16
return algorithmTime
然后在您的代码中添加yield hold命令:
def visit(self, timeAtNAT, res):
arrive=time.clock()-startTime
print("%7.4f. Packet #%s arrived." % (time.clock()-startTime, self.name))
yield request, self, res
wait = time.clock()-startTime - arrive
print("%7.4f. Packet #%s waited %6.3f" % (time.clock()-startTime, self.name, wait))
waitTime = self.calculateComputationComplexity(10)
yield hold, self, waitTime
yield release, self, res
print("%7.4f. Packet #%s left" % (time.clock()-startTime, self.name))
其中10应该用表示计算复杂性的int替换。 DES框架不使用多线程,它们只是按顺序确定性地计算所有内容,然后将其添加到事件发生的时间线。