Вот пример игрушки, который у меня есть. У меня есть класс Singleton, который используется в большом скрипте python. Я хочу, чтобы запустить этот сценарий много раз с несколькими входами: Одноэлементного шаблон не нужен здесь, но в моем более сложном реальном использовании есть причина, чтобы использовать егоСостояние, используемое при многопроцессорной обработке при использовании одноэлементных классов
import time
import multiprocessing
class TestClass(object):
instance = None
@classmethod
def get_instance(cls):
if cls.instance is None:
print 'creating instance'
cls.instance = TestClass()
return cls.instance
def __init__(self):
self.data = []
def worker(num):
tc = TestClass.get_instance()
time.sleep(0.1)
tc.data.append(num)
return tc.data
def main():
pool = multiprocessing.Pool(processes=1)
res = pool.map(worker, range(10))
print res
print TestClass.get_instance().data
main()
Когда я запускаю приведенный выше код, его кажется, состояние TestClass.instance
(полу-?) общий. Результат:
[[0, 1, 2], [0, 1, 2], [0, 1, 2], ..., [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
Если изменить число процессов до 10 я получаю:
[[0], [1], [2], [3], [4], [5], [6], [7], [8], [9]]
Это результат я хотел.
(Если я печатаю TestClass.get_instance().data
после вызова pool.map()
Затем я получаю пустой список.)
Что такое объяснение такого поведения? Есть ли способ остановить это разделение состояния и получить второй вывод, но сохранить контроль над количеством процессов в пуле?
Редактировать: Когда я выбираю N экземпляров для запуска функции с M различными аргументами. Экземпляр создается N раз. В идеале я хочу создать M экземпляров, по одному для каждого аргумента.
Почему вы используете одноэлементный шаблон здесь с многопроцессорной обработкой? Кажется, это немного лишнее, поскольку каждый подпроцесс получает свое собственное состояние интерпретатора (* хотя и разветвлено от родителя *). –
Его просто пример с игрушкой, реальный сценарий имеет гораздо больше возможностей, и некоторые из них означают, что я хочу использовать синглтон по разным причинам. – camz
Но вы понимаете, что ваш пример использования одноэлементного вида бесполезен? Так как вы каждый раз запускаете несколько экземпляров '' TestClass'' в каждом процессе? Если у вас '' процессы = 10'', вы создадите 10 экземпляров '' TestClass''. –