многопроцессорность: словарь не является постоянным - PullRequest
1 голос
/ 22 марта 2019

Я использую процессы для запуска различных функций внутри цикла несколько раз.Каждая функция должна возвращать вывод на каждой итерации, который является словарем.В настоящее время я создаю глобальный индексный словарь списков и добавляю каждый вывод в этот индекс.

В каждой итерации я вижу, что полученный словарь сохраняется в этом индексе, однако после нового набора итерацийрезультаты отсутствуют.Я подумал, что это может быть, потому что указатель на список был перезаписан через различные процессы, поэтому я создал экземпляр словаря индекса, а затем сохранил результаты непосредственно в определенной строке в списке (что также не удалось).Как новый процесс обрабатывает глобальные объекты?Я знаю, что это не поток, который разделяет память, и каждый процесс создает новые внутренние переменные, однако я не передаю ему глобальный индекс.

Разве процесс не должен записывать в память отца (по ссылке)?И почему глобальный индекс (словарь) сбрасывается после каждого нового набора итераций, а не после окончания каждого процесса?

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,...],...}

Я пытался сохранить егоминимальный, однако внутри цикла я использую и другие функции через процессы, которые также выводят словари.

...