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 冻结的主要内容,如果未能解决你的问题,请参考以下文章