Объявление переменных при мультипроцессинге
Сам код и код функции. Сама функция рабочая, и объявляет переменные, но при мультипроцессе не объявляет.
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:
- У процесса в другом мультипроцессинге ПОЛНОСТЬЮ свой набор переменных. Тупо на 100%. И глобалы там свои, внутри своего мультипроцесса.
- Я так и не нашел рабочего способа себе передать в мультипроцесс флаг чтобы остановить цикл... Пробовал совсем это дело упростить, ставил тупой цикл, 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