dev*_*evv 1 python parallel-processing multithreading multiprocessing
我始终确信没有必要拥有比CPU内核更多的线程/进程(从性能角度来看).但是,我的python示例显示了不同的结果.
import concurrent.futures
import random
import time
def doSomething(task_num):
print("executing...", task_num)
time.sleep(1) # simulate heavy operation that takes ~ 1 second
return random.randint(1, 10) * random.randint(1, 500) # real operation, used random to avoid caches and so on...
def main():
# This part is not taken in consideration because I don't want to
# measure the worker creation time
executor = concurrent.futures.ProcessPoolExecutor(max_workers=60)
start_time = time.time()
for i in range(1, 100): # execute 100 tasks
executor.map(doSomething, [i, ])
executor.shutdown(wait=True)
print("--- %s seconds ---" % (time.time() - start_time))
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
计划结果:
1工人--- 100.28233647346497秒---
2工人--- 50.26122164726257秒---
3工人--- 33.32741022109985秒---
4工人--- 25.399883031845093秒---
5工人--- 20.434186220169067秒---
10名工人--- 10.903695344924927秒---
50名工人--- 6.363946914672852秒---
60名工人--- 4.819359302520752秒---
如果只有4个逻辑处理器,这怎么能更快?
这是我的电脑规格(在Windows 8和Ubuntu 14上测试过):
CPU Intel(R)Core(TM)i5-3210M CPU @ 2.50GHz插槽:1个核心:2个 逻辑处理器:4个
原因是因为sleep()只使用了可忽略不计的CPU量.在这种情况下,它是对线程执行的实际工作的不良模拟.
所有sleep()真正的做法是暂停线程,直到计时器到期.线程暂停时,它不使用任何CPU周期.