Я пишу процедуру оптимизации для поиска методом перебора оптимальных гиперпараметров в пространстве решений; а 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 и переключился на нее из-за проблем с multiprocessing, которые не использовали все ядра. Сегодня я настроил свою машину и смог запустить оптимизацию только один раз. После этого он загадочным образом перестал работать без каких-либо изменений с моей стороны. Кроме того, я должен упомянуть, что он выдает вывод каждый раз из 10, когда я его запускаю. Очень странное поведение. Я ожидаю увидеть:
Something
Something
Something
.....
Как правило, это лучшие результаты оптимизации на «сегодняшний день» (опущены для ясности). Вместо этого я получаю:
Data Prepped, beginning search
***************************
Exiting, Optimization Complete
Если я вызываю get() для объекта async, результаты печатаются, как ожидалось, но используется только одно ядро, потому что результаты собираются в цикле for. Почему apply_async вообще ничего не делает? Я должен упомянуть, что я использую кнопку «стоп» в Pycharm, чтобы завершить процесс, не уверен, что это как-то связано с этим?
Дайте мне знать, если вам нужны более подробные сведения о prep() или bot.backtest().





Я нашел ошибку! В основном я преобразовывал dict() в list() и передавал значения из списка в свою функцию! Порядок параметров списка менялся каждый раз, когда я запускал функцию, и один из параметров должен был быть целым числом, а не числом с плавающей запятой.
По какой-то причине в окнах порядок словаря сохранялся при преобразовании в список; не в случае с Ubuntu! Очень интересно.