Многопроцессорная обработка, запускающая слишком много экземпляров 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()
14
задан Peter Hansen 17 December 2009 в 21:00
поделиться

3 ответа

Это более удобный способ / сокращение для выполнения действия над элементами в списке, MoreLinq расширяет эту функциональность для всех, реализующих IEnumerable.

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

20
ответ дан 1 December 2019 в 13:09
поделиться

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

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

0
ответ дан 1 December 2019 в 13:09
поделиться

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

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

0
ответ дан 1 December 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: