限制多线程中使用的资源

时间:2014-07-04 07:51:14

标签: python multithreading

我一直在使用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个线程并执行它们。 但是,这段代码的结果与我之前得到的结果不同,显然是错误的。这有什么问题?

1 个答案:

答案 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()