限制多线程中使用的资源

2024-09-27 07:34:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在用穿线。穿线具体如下:

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

由于数据量很大,我面临一个内存问题:我的一些订阅.呼叫引发内存问题,无法分配。为了避免这个问题,我尝试将同时执行的线程数量限制为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个线程并执行它们。 然而,这段代码的结果与我之前得到的结果不同,显然是错误的。怎么了?你知道吗


Tags: intargetforargsmyfuncthreadstartother
1条回答
网友
1楼 · 发布于 2024-09-27 07:34:21

线程在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()

相关问题 更多 >

    热门问题