我有一些运行数学模拟的代码,并对其进行了多次计算。
当我在没有多线程的情况下运行这段代码时,计时代码工作得非常好。
当我使用多线程运行代码时,时间不合理--使用手表,我估计它比运行实际代码所需的时间快4-8倍。(代码运行大约需要12秒,time模块说是1.52.5秒)
简化代码:(控制流在下面稍详细地解释)
class GenX:
def log_results(self, solver):
time2 = time.clock()
print '%0.3f' % time2 - self.time1
^
##### this value is incorrect ###########
def __init__(self):
self.time1 = time.clock()
mySimulation.setup()
mySimulation.OnceCompleteCall(log_results)
## (in reality both setup and start are more complicated)
def optimize(self):
mySimulation.start()
return我有另一个类实例化这个GenX类,然后运行GenX.optimize(),开始模拟。
模拟是一个单独的模块,它在内部处理线程代码(它也是一个1000行类,其中大约50%是不必要的getter/setters.因此,我认为作者很可能是问题的根源)
一旦模拟完成,它将调用log_results,它计算所需时间--这是不正确的。
目前,我不知道bug的来源是我的代码还是我正在使用的模块。
我已经检查了模块的作者在完成并行操作时调用了pool.join() --它确实被调用了,但是时间仍然不正确。
发布于 2014-11-04 16:42:08
根据您有多少线程,一次处理多少个线程,以及线程在做什么,我假设这与以下问题有关:https://codereview.stackexchange.com/a/26669。这可能是因为时钟只是在测量处理时间,而不是壁时间,因此得到的值比您预期的要低。
尝试使用time.time()代替。
https://stackoverflow.com/questions/21560111
复制相似问题