Python + SimPy保持进程计算时间

时间:2013-10-05 11:24:02

标签: python simulation simpy

我想进行模拟,其中服务时间取决于某些功能的计算复杂性。

由于功能处理,请求到达不应该停止。 为了测试,我使用了使用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的新手。

1 个答案:

答案 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框架不使用多线程,它们只是按顺序确定性地计算所有内容,然后将其添加到事件发生的时间线。

相关问题