Python 多线程池 Windows 冻结

Posted

技术标签:

【中文标题】Python 多线程池 Windows 冻结【英文标题】:Python Multithreading Pool Windows Freeze 【发布时间】:2018-01-30 12:05:06 【问题描述】:
import multiprocessing as mp    

    with mp.Pool(3) as pool:
        res = pool.starmap(sim.cosine, ((std_matrix[i], std_matrix[j]) for i in range(nU) for j in range(nU)))
        pool.close()
        pool.join()
    cos_matrix_uu = np.array(res).reshape(nU, nU)

在上面的代码nU = 6040中,我总共循环了36.481.600 (6040 * 6040)

我的值在大小为 (6040, 3060) 的二维数组 std_matrix 中。

对于std_matrix中的每一对行我计算余弦相似度:

def cosine(a, b):
    """Calculates the Cosine Similarity.
        :param a: array of ratings
        :param b: array of ratings
        :return: Cosine Similarity
    """
    divisor = (np.sqrt(np.dot(a, a)) * np.sqrt(np.dot(b, b)))
    if divisor == 0:
        return 0
    return np.divide(np.dot(a, b), divisor)

当我在不使用多线程的情况下运行此代码时,它会执行,但使用多线程时,我的电脑会死机。即使我使用 3 个线程。

我的 GPU 是 GTX850M。我可能做错了什么?

【问题讨论】:

【参考方案1】:

您的任务是 CPU 密集型任务,而不是 IO 密集型任务。由于 python 的 GIL,python 的多线程无法分发到多核。所以在某一时刻,将只有一个线程可以运行。它不适合这种任务类型。 只需使用多进程即可。

【讨论】:

“只使用多进程”是什么意思?我之前也使用过 ThreadPoolExecutor ,但同样如此。我现在用的不是多进程吗? 是的,您正在使用多进程。我的意思是不包括多线程。只使用多进程。 让我重新表述我的问题:假设我有一个大的二维浮点数组。 (5k,5k) 大小(= 25 mil 值)。我想用数组中的每个浮点数计算一个函数,并将其重新分配到相同的位置。我如何多线程这样 python 不会冻结?这可能吗? 已经说了,不适合这个问题。但它绝对可以做到。

以上是关于Python 多线程池 Windows 冻结的主要内容,如果未能解决你的问题,请参考以下文章

Windows 线程池

Python 线程池模块,Python 多线程

Python简单的线程池

python 爬虫加入线程池问题

python 多线程-02 线程池

Java多线程 二 线程间通信