Я пытаюсь импортировать mymodule.py
в конструктор класса C, чтобы каждый новый экземпляр класса C использовал свой собственный модуль, когда метод f
вызывается как новый процесс с использованием многопроцессорного модуля.
Пожалуйста, ознакомьтесь с кодом ниже:
mymodule.py
import random
n = random.randint(0, 1000)
mp_test.py
import time
import multiprocessing as mp
import imp
class C(object):
def __init__(self, c='*'):
self.mm=imp.load_module('mm', *imp.find_module('mymodule'))
self.c = c
def f(self):
print self.c, id(self.mm), id(self.mm.n), self.mm.n
def main():
p = []
for _ in range(2):
p.append(mp.Process(target=C().f))
p[-1].start()
time.sleep(1)
print ''
p0 = mp.Process(target=C(c='>').f)
p1 = mp.Process(target=C(c='>').f)
p0.start()
p1.start()
if __name__ == '__main__':
main()
После выполнения mp_test.py
результатом stdout будет:
funk@linux:~/mp_test# python mp_test.py
* 140679674677800 94828316092856 40
* 140679674677800 94828316835224 486
> 140679674677800 94828317211688 763
> 140679674677800 94828317211688 763
Как и ожидалось, следующий фрагмент кода создает для различных экземпляров mymodule
и, следовательно, генерируются два разных случайных числа:
p = []
for _ in range(2):
p.append(mp.Process(target=C().f))
p[-1].start()
* 140679674677800 94828316092856 40
* 140679674677800 94828316835224 486
Когда методы start()
вызываются следующим образом mymodule
не импортируется дважды и, следовательно, случайные числа совпадают ...
p0 = mp.Process(target=C(c='>').f)
p1 = mp.Process(target=C(c='>').f)
p0.start()
p1.start()
> 140679674677800 94828317211688 763
> 140679674677800 94828317211688 763
Ваши идеи, пожалуйста ...!
Редактировать
предложение zwer решает проблему:
Исправление кода
# ERROR self.mm=imp.load_module('mm', *imp.find_module('mymodule'))
self.mm=imp.load_module('mm_' + str(uuid.uuid4()), *imp.find_module('mymodule'))
Обновленные результаты
funk@linux:~/mp_test# python -O mp_test.py
* 139813126327944 94540189500648 396
* 139813126447184 94540189500504 491
> 139813126447296 94540189500432 847
> 139813126447240 94540189500384 389
Обратите внимание , что 1-й столбец последних результатов, представляющий id(self.mm)
, всегда отличается!