Многопроцессорство запускает слишком много экземпляров 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 не вызывает ничего, что могло бы запустить новый экземпляр, например, в качестве побочного эффекта импорта, если ваш код работает непосредственно при импорте?