Python pool.apply_async()不调用目标函数?

时间:2018-06-14 01:10:01

标签: python-3.x multiprocessing ubuntu-16.04

我正在编写一个优化例程来强制搜索解决方案空间以获得最佳超参数;并且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()

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

Something
Something
Something
 .....

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

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

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

如果您需要有关prep()bot.backtest()

的更多详情,请与我们联系

1 个答案:

答案 0 :(得分:0)

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

出于某种原因,在Windows上,转换为列表时保留了dict的顺序;不是Ubuntu的情况!非常有趣。