Я использую процессы для запуска различных функций внутри цикла несколько раз.Каждая функция должна возвращать вывод на каждой итерации, который является словарем.В настоящее время я создаю глобальный индексный словарь списков и добавляю каждый вывод в этот индекс.
В каждой итерации я вижу, что полученный словарь сохраняется в этом индексе, однако после нового набора итерацийрезультаты отсутствуют.Я подумал, что это может быть, потому что указатель на список был перезаписан через различные процессы, поэтому я создал экземпляр словаря индекса, а затем сохранил результаты непосредственно в определенной строке в списке (что также не удалось).Как новый процесс обрабатывает глобальные объекты?Я знаю, что это не поток, который разделяет память, и каждый процесс создает новые внутренние переменные, однако я не передаю ему глобальный индекс.
Разве процесс не должен записывать в память отца (по ссылке)?И почему глобальный индекс (словарь) сбрасывается после каждого нового набора итераций, а не после окончания каждого процесса?
class my_dict(object):
def __init__(self, increase_cost, max_cost, step):
self.performance = dict()
self.weights = dict()
self.init_arrays(increase_cost, max_cost, step)
def init_arrays(self, increase_cost, max_cost, step):
for i in range (increase_cost, max_cost+step, step):
self.performance[i] = [None for k in range(0,31)]
self.weights[i] = [None for k in range(0,31)]
original = my_dict(increase_cost,max_cost,step)
...
while increase_cost <= max_cost :
k_fold_iteration = 0
for iter in range(0,3):
print "iteration = " + str(iter)
start = time.time()
kf = StratifiedKFold(n_splits=10, random_state=int(time.time()), shuffle=True)
for train_index, test_index in kf.split(X,y):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
process1 = Process(target=train_original_classifier, args=(X_train, X_test, y_train, y_test, sa_index,p_Group, costs, increase_cost, k_fold_iteration))
threads.append(process1)
k_fold_iteration +=1
process1.start()
...
for process in threads:
process.join()
def train_original_classifier(X_train, X_test, y_train, y_test, sa_index,p_Group, costs, increase_cost, idx):
...
original.performance[increase_cost][idx]= calculate_fairness(X_test, y_test, y_pred_labels, y_pred_probs, sa_index, p_Group)
print original.performance
Вывод:
{0: [None, ...], 1: [None,...], 2: [results, results,...],...}
Я пытался сохранить егоминимальный, однако внутри цикла я использую и другие функции через процессы, которые также выводят словари.