加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何在Python ThreadPool中使用初始化程序

发布时间:2020-12-20 13:24:36 所属栏目:Python 来源:网络整理
导读:我正在尝试使用PyFFTW进行线程卷积,以便计算大量的 同时进行2D卷积. (由于GIL已经发布,因此不需要单独的流程 为Numpy运营). 现在这里是这样做的规范模型: http://code.activestate.com/recipes/577187-python-thread-pool/ (Py)FFTW是如此之快,因为它重用了
我正在尝试使用PyFFTW进行线程卷积,以便计算大量的
同时进行2D卷积.
(由于GIL已经发布,因此不需要单独的流程
为Numpy运营).
现在这里是这样做的规范模型:
http://code.activestate.com/recipes/577187-python-thread-pool/

(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',nthreads=1)               
        self.start()

通过这种方式,可以将self.inputa,self.fft,self.inputb,self.ifft参数传递给Worker类中run方法中的实际卷积器.

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

from multiprocessing.pool import ThreadPool

但是我应该如何在ThreadPool中定义初始化器以获得相同的结果呢?
根据文件
http://docs.python.org/library/multiprocessing.html
“每个工作进程在启动时都会调用初始化程序(* initargs)”.
您可以在Python源代码中轻松检查这一点.

但是,在设置Threadpool时,例如使用2个线程:

po = ThreadPool(2,initializer=tobedetermined)

然后你可以在某个循环中运行它

po.apply_async(convolver,(some_input,))

如何通过初始化程序设置卷积器?你怎么能让它单独使用
FFTW计划在每个线程中,而不重新计算每个卷积的FFTW计划?

干杯,
亚历克斯.

解决方法

你可以使用一个使用线程局部存储(threading.local())来初始化PyFFTW并记住结果的函数来包装卷积器调用

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读