【发布时间】:2019-09-04 05:27:02
【问题描述】:
我正在尝试模拟一些流程以获得一些统计数据。我决定使用多个线程编写模拟程序,因为每个测试运行都是独立的。
这意味着如果我需要执行例如1000 次测试运行,那么应该可以有 4 个线程(每个执行 250 次测试运行)。
在执行此操作时,我发现添加多个线程不会减少模拟时间。
我有 4 个物理内核的 Windows 10 笔记本电脑。
我编写了一个简单的程序来显示我正在谈论的行为。
from concurrent.futures import ThreadPoolExecutor
import time
import psutil
import random
def runScenario():
d = dict()
for i in range(0, 10000):
rval = random.random()
if rval in d:
d[rval] += 1
else:
d[rval] = 1
return len(d)
def runScenarioMultipleTimesSingleThread(taskId, numOfCycles):
print('starting thread {}, numOfCycles is {}'.format(taskId, numOfCycles))
sum = 0
for i in range(numOfCycles):
sum += runScenario()
print('thread {} finished'.format(taskId))
return sum
def modelAvg(numOfCycles, numThreads):
pool = ThreadPoolExecutor(max_workers=numThreads)
cyclesPerThread = int(numOfCycles / numThreads)
numOfCycles = cyclesPerThread * numThreads
futures = list()
for i in range(numThreads):
future = pool.submit(runScenarioMultipleTimesSingleThread, i, cyclesPerThread)
futures.append(future)
sum = 0
for future in futures:
sum += future.result()
return sum / numOfCycles
def main():
p = psutil.Process()
print('cpus:{}, affinity{}'.format(psutil.cpu_count(), p.cpu_affinity() ))
start = time.time()
modelAvg( numOfCycles = 10000, numThreads = 4)
end = time.time()
print('simulation took {}'.format(end - start))
if __name__ == '__main__':
main()
这些是结果:
一个线程:
cpus:8, affinity[0, 1, 2, 3, 4, 5, 6, 7]
starting thread 0, numOfCycles is 10000
thread 0 finished
simulation took 23.542529582977295
四个线程:
cpus:8, affinity[0, 1, 2, 3, 4, 5, 6, 7]
starting thread 0, numOfCycles is 2500
starting thread 1, numOfCycles is 2500
starting thread 2, numOfCycles is 2500
starting thread 3, numOfCycles is 2500
thread 1 finished
thread 2 finished
thread 0 finished
thread 3 finished
simulation took 23.508538484573364
我希望在使用 4 线程时,模拟时间理想情况下应该缩短 4 倍,当然它不应该相同。
【问题讨论】:
-
您有问题吗?
标签: python multithreading