Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用线程/线程模块Python2.7的好处_Python - Fatal编程技术网

使用线程/线程模块Python2.7的好处

使用线程/线程模块Python2.7的好处,python,Python,1) 我已经读到,如果我在python中导入线程模块,CPU绑定的负载将不会从使用这个库中看到太多好处,因为GIL强制线程一次运行1个线程,即使我在多核机器上运行代码。如果是这种情况,使用Python的线程库会使哪种代码受益 2) 如果线程库是这种情况,那么要并行执行CPU密集型任务,例如两个信号的互相关,多处理模块是最佳使用的模块吗 为了使这更具体,假设我想并行化的任务是下面代码中的for循环,我的机器只有12个内核。假设我的模板长度为~1000,我的图像长度为~2000,我有~1000个信号

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。