Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.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
如何在Python线程池中使用初始值设定项_Python_Multithreading_Fftw_Convolution - Fatal编程技术网

如何在Python线程池中使用初始值设定项

如何在Python线程池中使用初始值设定项,python,multithreading,fftw,convolution,Python,Multithreading,Fftw,Convolution,我尝试使用PyFFTW进行线程卷积,以计算大量的 同时进行二维卷积。 (由于GIL已发布,因此不需要单独的流程 用于Numpy操作)。 下面是这样做的标准模型: (Py)FFTW速度如此之快是因为它重用了计划。必须为每个线程分别设置这些线程,以避免访问冲突错误,如下所示: class Worker(Thread): """Thread executing tasks from a given tasks queue""" def __init__(self, tasks):

我尝试使用PyFFTW进行线程卷积,以计算大量的 同时进行二维卷积。 (由于GIL已发布,因此不需要单独的流程 用于Numpy操作)。 下面是这样做的标准模型:

(Py)FFTW速度如此之快是因为它重用了计划。必须为每个线程分别设置这些线程,以避免访问冲突错误,如下所示:

class Worker(Thread):
    """Thread executing tasks from a given tasks queue"""
    def __init__(self, tasks):
        Thread.__init__(self)
        self.tasks = tasks
        self.daemon = True

        # Make separate fftw plans for each thread.
        flag_for_fftw='patient'      
        self.inputa = np.zeros(someshape, dtype='float32')
        self.outputa = np.zeros(someshape_semi, dtype='complex64')

        # create a forward plan.
        self.fft = fftw3.Plan(self.inputa,self.outputa, direction='forward', flags=[flag_for_fftw],nthreads=1)         

        # Initialize the arrays for the inverse fft.
        self.inputb = np.zeros(someshape_semi, dtype='complex64')
        self.outputb = np.zeros(someshape, dtype='float32')

        # Create the backward plan.
        self.ifft = fftw3.Plan(self.inputb,self.outputb, direction='backward', flags=[flag_for_fftw],nthreads=1)               
        self.start() 
通过这种方式,可以将参数
self.inputa
self.outputa
self.fft
self.inputb
self.outputb
self.ifft
传递给Worker类中run方法内的实际卷积器

这很好,但我们不妨导入ThreadPool类:

from multiprocessing.pool import ThreadPool
但是我应该如何在ThreadPool中定义初始值设定项以获得相同的结果呢? 根据文件 “每个工作进程启动时将调用初始值设定项(*initargs)”。 您可以在Python源代码中轻松检查这一点

但是,当您设置线程池时,例如使用2个线程:

po = ThreadPool(2,initializer=tobedetermined)
然后你运行它,也许在某个循环中

po.apply_async(convolver,(some_input,))
如何通过初始化器设置卷积器?你怎么能把它分开使用呢 每个线程中的FFTW计划,而不为每个卷积重新计算FFTW计划

干杯,
Alex。

您可以使用一个函数包装卷积器调用,该函数使用线程本地存储(
threading.Local()
)初始化PyFFTW并记住结果