Python+;过程计算时间的SimPy保持

Python+;过程计算时间的SimPy保持,python,simulation,simpy,Python,Simulation,Simpy,我想进行模拟,其中服务时间取决于某些函数的计算复杂度 请求到达不应因函数处理而停止。 为了进行测试,我使用了使用cpu数秒的示例函数: sorted([float(random.random()) for i in range(1000000)]) 如何调用它来模拟服务,但不阻止新的服务请求到达。如果我调用这个函数,新的服务请求将在函数执行之后到达,而不是在指定的时间到达 def visit(self, timeAtNAT, res): arrive=time.clock()-startT

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

请求到达不应因函数处理而停止。 为了进行测试,我使用了使用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))
所以,在我的示例中,新数据包只在前一个数据包离开后到达


我试图使用
多处理
,但遇到了命名冲突(属于
进程
类)。
我是SimPy、并行编程和Python的新手

我认为你在这里混合了各种方法,如果你在模拟复杂的计算——你实际上没有做复杂的计算——你会做一个算法,计算出计算所需的时间数量级,然后给它添加一些随机抖动(即,将其更改+/-5%或其他)

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

让我们用这个算法来计算复杂计算所需的时间。让我们把它变成指数复杂度的算法,即用大O表示法:O(2n)


其中,10应替换为表示计算复杂性的int。DES框架不使用多线程,它们只是按顺序确定地计算所有内容,然后将其添加到要发生的事件的时间线中。

我不知道simpy,但“离散事件模拟”可能与之相反“并行编程”。对我来说,实际的挂钟时间应该影响模拟结果的想法听起来很奇怪。另外,你想了解Python GIL(全局解释器锁)。“我试图使用
多处理
,但我遇到了命名冲突(关于
进程
类)“这怎么可能?进行
多处理。处理(…)
永远不会使用其他类,除非您修改模块。此外,您还可以使用
as
从多处理导入过程导入别名为
的类作为EasterBunny
,然后在创建新进程时使用
EasterBunny
。您使用的是哪个版本的Simpy?
def calculateComputationComplexity(self, cValue):
    #lets make this an exponential algorithm
    algorithmTime = 0
    if cValue < 17:
        algorithmTime = 2**cValue
    else:
        algorithmTime = 2**16
    return algorithmTime
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))