python 在for循环中使用多处理的scipy差分进化

ercv8c1e  于 2023-02-02  发布在  Python
关注(0)|答案(1)|浏览(99)

代码很简单,我认为它是什么并不重要。可能是错的,我不是最好的。
我试图让scipy的差分进化函数在for循环中进行多处理。我尝试了几种方法来让它工作,但我无法理解。它似乎总是需要ifname== 'main':因为分叉的原因(我真的不知道这是什么意思,我试着在网上读到它,但我还是不明白)。然而,因为ifname== 'main':,它最终会运行整个代码很多次,我不知道为什么。我认为这与认为缩进比ifname== 'main'少的所有代码有关:begins是全局函数,需要从头开始运行,因为我的所有其他全局函数都是在递归循环中多次运行的。idk,如果你认为有帮助的话,我可以分享更多。

def voldiscovery(): 
    alpha = .25 
    currentvol = currentvolcalc(hvwindow)
    for y in range (16, len(logreturns)):

        if __name__ == '__main__':
            x = currentvol[15:y]
            z = estimates[y]
    
            args = (x, z)
            bounds = [(.01, .5)]
                sol1 = differential_evolution(alphaoptimizer, strategy='best1exp', maxiter=3000,              init='latinhypercube', bounds=bounds, updating='deferred', workers=-1, args=args)

我试着放弃ifname== 'main':,那不起作用,我试着放进另一个函数,在for循环中调用那个函数,那绝对不起作用。
我希望对于for循环的每次迭代,它都会运行一次优化(在所有内核上),然后在for循环结束后继续轻松地运行下一段代码。

umuewwlo

umuewwlo1#

使用多重处理要求你的代码是可导入的而没有副作用。
具体来说,您应该按如下方式定义代码:

import multiprocessing
import my_modules

def function1():
    ...

def function2():
    ...

def main():
    ...

if __name__ == "__main__":
    main()

上面的模块可以在不触发应用程序执行的情况下导入,因为如果其他进程使用spawn启动(这基本上意味着您正在使用windows/macOS,或者您将start方法设置为在linux上生成),它们**会导入您的模块

相关问题