Многопроцессорный запуск слишком большого количества экземпляров Python VM - PullRequest
14 голосов
/ 17 декабря 2009

Я пишу некоторый многопроцессорный код (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()

Ответы [ 3 ]

20 голосов
/ 18 декабря 2009

Похоже, вы не очень тщательно следовали инструкциям в документации, в частности в этом разделе , где говорится о "Безопасном импорте основного модуля".

Вам нужно защитить код запуска с помощью блока if __name__ == '__main__':, иначе вы получите то, что получаете, я считаю.

Я полагаю, что все сводится к тому, что многопроцессорный модуль не может использовать os.fork (), как в Linux, где уже запущенный процесс в основном клонируется в памяти. В Windows (у которой нет такого fork ()) он должен запустить новый интерпретатор Python и сказать ему импортировать ваш основной модуль, а затем выполнить метод start / run, как только это будет сделано. Если у вас есть код на «модульном уровне», незащищенный проверкой имени, то при импорте он начинает всю последовательность заново, до бесконечности

0 голосов
/ 17 декабря 2009

Я не вижу в этом ничего плохого. Отлично работает на Ubuntu 9.10 (Python 2.6.4).

Вы уверены, что у вас нет cron или чего-то еще, запускающего несколько копий вашего скрипта? Или что порожденный скрипт не вызывает ничего, что могло бы запустить новый экземпляр, например, как побочный эффект импорта, если ваш код запускается непосредственно при импорте?

0 голосов
/ 17 декабря 2009

Когда я запускаю это в Linux с python2.6, я вижу максимум 4 процесса python2.6, и я не могу гарантировать, что они все из этого процесса. Они определенно не заполняют машину.

Нужна новая версия Python? Разница в Linux / Windows?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...