使用线程/线程模块Python2.7的好处
1) 我已经读到,如果我在python中导入线程模块,CPU绑定的负载将不会从使用这个库中看到太多好处,因为GIL强制线程一次运行1个线程,即使我在多核机器上运行代码。如果是这种情况,使用Python的线程库会使哪种代码受益 2) 如果线程库是这种情况,那么要并行执行CPU密集型任务,例如两个信号的互相关,多处理模块是最佳使用的模块吗 为了使这更具体,假设我想并行化的任务是下面代码中的for循环,我的机器只有12个内核。假设我的模板长度为~1000,我的图像长度为~2000,我有~1000个信号要排序:使用线程/线程模块Python2.7的好处,python,Python,1) 我已经读到,如果我在python中导入线程模块,CPU绑定的负载将不会从使用这个库中看到太多好处,因为GIL强制线程一次运行1个线程,即使我在多核机器上运行代码。如果是这种情况,使用Python的线程库会使哪种代码受益 2) 如果线程库是这种情况,那么要并行执行CPU密集型任务,例如两个信号的互相关,多处理模块是最佳使用的模块吗 为了使这更具体,假设我想并行化的任务是下面代码中的for循环,我的机器只有12个内核。假设我的模板长度为~1000,我的图像长度为~2000,我有~1000个信号
import numpy as np
###2-D array of shape (points, signals)
signals = np.load('signals.npy')
###1-D template array for cross correlation
templateSignal = np.load('template.npy')
for s in range(signals.shape[2]):
xcorr = np.correlate(templateSignal, signal[:,s])
即使使用GIL,Python中的线程也很有用,因为输入/输出操作不会阻塞程序。您可以在等待磁盘操作完成或等待网络事件时执行操作 线程在GUI应用程序中也发挥着作用,在GUI应用程序中,程序可以在后台执行计算时保持对用户输入的响应(感谢@FogleBird)
对于2),您的假设是正确的,您可以使用
多处理
模块将CPU密集型程序扩展到多个内核。了解流程之间通信的成本 当您有GUI时,也可用于后台任务,因此,GUI保持响应。是否假设后台任务是IO操作,而不是矩阵乘法等CPU密集型操作?@nCruber如果不使用线程,您无法播放mp3并在播放过程中暂停它-在播放mp3时,UI会锁定playing@ncRubert:numpy.dot()
可以执行矩阵乘法的函数使用多个CPU,而不使用多个进程。注意:C扩展可以释放GIL,而它们不涉及Python对象,例如,一些numpy函数确实释放GIL。