首页 > 解决方案 > Python pool.apply_async() 不调用目标函数?

问题描述

我正在编写一个优化例程来蛮力搜索解决方案空间以获得最佳超参数;并且apply_async似乎根本没有做任何事情。Ubuntu Server 16.04、Python 3.5、PyCharm CE 2018。另外,我在 Azure 虚拟机上执行此操作。我的代码如下所示:

class optimizer(object):

    def __init__(self,n_proc,frame):

        # Set Class Variables

    def prep(self):

        # Get Data and prepare for optimization


    def ret_func(self,retval):

        self.results = self.results.append(retval)
        print('Something')

    def search(self):

        p = multiprocessing.Pool(processes=self.n_proc)

        for x, y in zip(repeat(self.data),self.grid):

            job = p.apply_async(self.bot.backtest,(x,y),callback=self.ret_func)

        p.close()
        p.join()

        self.results.to_csv('OptimizationResults.csv')

        print('***************************')
        print('Exiting, Optimization Complete')

if __name__ == '__main__':

    multiprocessing.freeze_support()

    opt = optimizer(n_proc=4,frame='ytd')
    opt.prep()
    print('Data Prepped, beginning search')
    opt.search()

multiprocessing我在 Windows Server VM 上运行此精确设置,但由于未使用所有内核的问题而切换。今天,我配置了我的机器,并且只能运行一次优化。在那之后,它神秘地停止了工作,而我没有任何改变。另外,我应该提到它在我运行它的 10 次中每 1 次输出输出。非常奇怪的行为。我希望看到:

Something
Something
Something
 .....

这通常是优化的最佳“最新”结果(为清楚起见,省略)。相反,我得到:

Data Prepped, beginning search
***************************
Exiting, Optimization Complete

如果我调用get()async对象,结果将按预期打印,但只使用一个内核,因为结果正在for循环中收集。为什么apply_async什么都不做?我应该提到我使用 Pycharm 上的“停止”按钮来终止进程,不确定这是否与它有关?

如果您需要更多关于prep(), 或bot.backtest()

标签: python-3.xmultiprocessingubuntu-16.04

解决方案


我发现了错误!基本上我正在将 a 转换dict()为 alist()并将列表中的值传递给我的函数!每次我运行函数时,列表参数顺序都不同,其中一个参数需要是整数,而不是浮点数。

出于某种原因,在 Windows 上,转换为列表时会保留 dict 的顺序;Ubuntu 不是这样!很有意思。


推荐阅读