python-3.x - 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()
解决方案
我发现了错误!基本上我正在将 a 转换dict()
为 alist()
并将列表中的值传递给我的函数!每次我运行函数时,列表参数顺序都不同,其中一个参数需要是整数,而不是浮点数。
出于某种原因,在 Windows 上,转换为列表时会保留 dict 的顺序;Ubuntu 不是这样!很有意思。
推荐阅读
- javascript - AVA 是否有超时默认值?
- angular - 单个数据源的多个反应式表单组
- testing - 在集成测试中访问内存 dbcontext
- omnet++ - 在 Windows 上使用 Veins 和 OMNET++ 配置 RInside
- php - 网站随机只显示文本,没有 html
- c# - 使用带有 React 的 ASP.Net Core 将图像添加到 SQL 数据库中
- reporting-services - 在表顶部重复行组作为 SSRS 中每个组之间的表头
- javascript - 满足条件时停止我的循环运行
- azure - 为什么 Azure 活动日志在成功后会重复资源的日志?
- html - 带有换行符的 Flex HTML CSS 问题