【发布时间】:2019-10-10 23:02:52
【问题描述】:
我有一个通过多线程执行某个功能的脚本。现在,让并行运行的线程数量与拥有 CPU 核心的数量一样多是很有趣的。 现在使用 threading.thread 语句的当前代码 (1:) 创建了 1000 个线程并同时运行它们。 我想把它变成同时只运行固定数量的线程(例如 8 个)的东西,并将其余的放入队列中,直到正在执行的线程/cpu 核心可以免费使用。
1:
import threading
nSim = 1000
def simulation(i):
print(str(threading.current_thread().getName()) + ': '+ str(i))
if __name__ == '__main__':
threads = [threading.Thread(target=simulation,args=(i,)) for i in range(nSim)]
for t in threads:
t.start()
for t in threads:
t.join()
Q1:代码2:是否符合我的描述? (同时运行最大线程数的多线程)是否正确? (我想是的,但我不是 100% 确定)
Q2:现在代码同时启动1000个线程,在8个线程上执行。有没有办法只在执行线程/cpu 内核空闲时才启动一个新线程(这样我就没有 990 个线程调用从一开始就等待执行?
Q3:有没有办法跟踪哪个cpu-core执行了哪个线程?只是为了证明代码正在做它应该做的事情。
2:
import threading
import multiprocessing
print(multiprocessing.cpu_count())
from concurrent.futures import ThreadPoolExecutor
nSim = 1000
def simulation(i):
print(str(threading.current_thread().getName()) + ': '+ str(i))
if __name__ == '__main__':
with ThreadPoolExecutor(max_workers=8) as executor:
for i in range (nSim):
res = executor.submit(simulation, i)
print(res.result())
【问题讨论】:
标签: python multithreading python-multithreading threadpoolexecutor