0

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

请求到达不应由于函数处理而停止。为了测试,我使用了利用 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 方面的新手。

4

1 回答 1

0

我认为你在这里混合了方法,如果你在模拟复杂的计算——你实际上并没有进行复杂的计算——你制作一个算法来计算计算所花费的时间数量级,然后添加一些随机抖动它(即改变 +/- 5% 或其他东西)。

SimPy 是一个离散事件模拟框架 - 这意味着所有计算都在模拟时间内有效地即时发生,因为模拟不会继续进行下一个事件(并且要在模拟时间内继续前进,必须继续进行下一个事件- {虽然移动到下一个事件并不意味着在模拟时间上向前移动,因为下一个事件可能同时发生})。

让我们制作这个算法来计算复杂计算所花费的时间。让我们让它成为指数复杂度的算法,即大 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 框架不使用多线程,它们只是按顺序确定性地计算所有内容,然后将其添加到要发生的事件的时间线中。

于 2013-12-16T13:29:10.830 回答