Объявление переменных при мультипроцессинге

Сам код и код функции. Сама функция рабочая, и объявляет переменные, но при мультипроцессе не объявляет.

from multiprocessing import Process

def gen(count, count1):
    mass = {}

    #цыкл записи в mass

    globals()['mass_' + str(count1)] = mass

if __name__ =='__main__':
    count_create = 15

    gen_int = 10000 / count_create

    for i in range(count_create):
        t = Process(target=gen, args=(int(gen_int), i))
        threads.append(t)

    for i in range(count_create):
        threads[i].start()

    for i in range(count_create):
        threads[i].join()

    print(mass_0) # error / ошибка
    print(globals()['mass_' + '0']) # error / ошибка

Ответы (1 шт):

Автор решения: Gh0sTG0

Судя по тому, что я нашел в свое время в интернетах перед тем как пересесть на чистые from threading import Thread:

  1. У процесса в другом мультипроцессинге ПОЛНОСТЬЮ свой набор переменных. Тупо на 100%. И глобалы там свои, внутри своего мультипроцесса.
  2. Я так и не нашел рабочего способа себе передать в мультипроцесс флаг чтобы остановить цикл... Пробовал совсем это дело упростить, ставил тупой цикл, print'ающий мне раз в 5 секунд привет в консоль, и проверку переменной... И кнопку в ткинтере которая мне должна как то переменную изменять... Так и не смог наладить передачу из процесса интерфейса в процесс цикла... Вроде как единственный способ передать туда хоть какие то данные, это когда запускаешь функцию ей запихнуть аргументом переменную с содержимым... Но потом оно уже начнет молотиться и ты туда не подлезешь...

Хотя я не претендую на истину в последней инстанции, всего лишь то что я нашел и к чему пришел. Если кто то знает как передавать данные НЕ городя что то типа текстового файла со значением, или базы данных и.т.п. из которых оба процесса будут читать данные и передавать информацию... Буду рад узнать, мб свою программу переделаю...

Я тут покопался, в общем твой код надо делать через multiprocessing.Manager():

import multiprocessing


def gen(count, count1, return_dict):
    return_dict[count1] = count + count1  # ну или чего ты с ними делать хочешь, делаешь и запихиваешь в return_dict


if __name__ == '__main__':
    count_create = 15

    gen_int = 10000 / count_create

    manager = multiprocessing.Manager()
    return_dict = manager.dict()
    jobs = []

    for i in range(count_create):
        p = multiprocessing.Process(target=gen, args=(int(gen_int), i, return_dict))
        jobs.append(p)
        p.start()

    for proc in jobs:
        proc.join()

    for i in range(count_create):
        print(str(i) + " = " + str(return_dict[i]))

print дают вывод:

0 = 666
1 = 667
2 = 668
3 = 669
4 = 670
5 = 671
6 = 672
7 = 673
8 = 674
9 = 675
10 = 676
11 = 677
12 = 678
13 = 679
14 = 680
→ Ссылка