Многопроцессорство запускает слишком много экземпляров Python VM
Я пишу многопроцессорный код (Python 2.6.4, WinXP), который запускает процессы для запуска фоновых задач. Играя с некоторыми тривиальными примерами, я сталкиваюсь с проблемой, когда мой код просто постоянно порождает новые процессы, хотя я только говорю, чтобы он породил фиксированный номер.
Сама программа работает нормально, но если я смотрю в Windows TaskManager, я вижу, как появляются новые процессы "python.exe". Они просто продолжают расти все больше и больше по мере запуска программы (в конечном итоге, голодая моя машина).
Например, фотографии
Я ожидаю, что приведенный ниже код запускает 2 процесса python.exe. Первая из них - сама программа, а вторая - дочерний процесс, который она порождает. Любая идея, что я делаю неправильно?
import time
import multiprocessing
class Agent(multiprocessing.Process):
def __init__(self, i):
multiprocessing.Process.__init__(self)
self.i = i
def run(self):
while True:
print 'hello from %i' % self.i
time.sleep(1)
agent = Agent(1)
agent.start()
Ответы
Ответ 1
Похоже, вы не внимательно следили за рекомендациями в документации, в частности в этом разделе, где говорится о "безопасном импорте основного модуля".
Вам нужно защитить свой код запуска блоком if __name__ == '__main__':
, или вы получите то, что получаете, я считаю.
Я считаю, что к модулю многопроцессорности не удается использовать os.fork(), как в Linux, где уже запущенный процесс в основном клонируется в памяти. В Windows (у которого нет такого fork()) он должен запустить новый интерпретатор Python и сообщить ему, чтобы он импортировал ваш основной модуль, а затем выполнил метод start/run после этого. Если у вас есть код на уровне модуля, незащищенный проверкой имени, то во время импорта он запускает всю последовательность заново, ad infinitum
Ответ 2
Когда я запускаю это в Linux с помощью python2.6, я вижу максимум 4 процесса python2.6, и я не могу гарантировать, что они все из этого процесса. Они определенно не заполняют машину.
Нужна новая версия python? Разница Linux/Windows?
Ответ 3
Я не вижу в этом ничего плохого. Хорошо работает на Ubuntu 9.10 (Python 2.6.4).
Уверены ли вы, что у вас нет cron или что-то, начинающего несколько копий вашего script? Или что порожденный script не вызывает ничего, что могло бы запустить новый экземпляр, например, в качестве побочного эффекта импорта, если ваш код работает непосредственно при импорте?