python - 限制多线程中使用的资源

标签 python multithreading

我一直在并行化调用 myfunc 和 threading.Thread 的代码,如下所示:

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

最佳答案

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

关于python - 限制多线程中使用的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24569267/

相关文章:

Python:如何在 Pandas 中创建加权分位数?

python - 一直试图让用户输入分钟,以便 Python 可以将其转换为命令行的秒

python - Python 中的函数式数据类型

python - tkinter 使用 ID 设置焦点

python - Biopython 支持 Python 3.2 吗?

java - 可运行的子类,普通的父类(super class),如何运行子类?

python - PyQt:使用线程访问对象

java - 线程完成后是否释放锁?

java - 使用线程处理列表的智能方法

java - 并行矩阵乘法