我一直在使用threading.Thread并行调用myfunc
的代码,如下所示:
def myfunc(elt,other):
subprocess.call("A matlab script that takes a while to execute")
allThreads = []
for elt in allElts:
allThreads.append(threading.Thread(target=myfunc,args=(elt,other)))
for t in allThreads:
t.start()
for t in allThreads:
t.join()
由于数据量很大,我遇到了内存问题:我的一些subscribe.call引发了内存问题,无法分配。为避免此问题,我尝试将同时执行的线程数限制为8.我将上面的代码更改为以下内容:
someThreads = []
k = 0
for k in range(len(allElts)):
if k%8 == 1:
for t in someThreads:
t.start()
for t in someThreads:
t.join()
someThreads = []
someThreads.append(threading.Thread(target=myfunc,args=(allElts[k],other)))
else:
someThreads.append(threading.Thread(target=myfunc,args=(allElts[k],other)))
k += 1
这应该最多创建8个线程并执行它们。 但是,这段代码的结果与我之前得到的结果不同,显然是错误的。这有什么问题?
答案 0 :(得分:5)
线程在k%8 == 1
之前才会启动,然后新线程会添加到新的someThreads
,但未启动。
这意味着在循环结束时,someThreads
中至少有一个线程无法通过调用t.start()
开始。
相反,请使用multiprocessing ThreadPool:
import multiprocessing as mp
import multiprocessing.pool as mpool
pool = mpool.ThreadPool(8)
for elt in allElts:
pool.apply_async(myfunc, args=(elt,other))
pool.close()
pool.join()