порождает несколько процессов / демонов Python с одинаковыми именами (разные аргументы) - PullRequest
1 голос
/ 21 марта 2012

Я пытаюсь создать независимые процессы в Python. Эти процессы представляют собой сценарий Python, который я хочу иметь несколько экземпляров, но создается с различными аргументами. Проще говоря, из цикла for я вызываю subprocess.Popen (), но с различными значениями аргументов:

for d in mylist:
    subprocess.Popen(['./subscriber.py', d.arg1, a.arg2, d.arg3])

В subscriber.py у меня есть код, который "демонизирует" процесс согласно различным рецептам В качестве альтернативы, я также попытался запустить мой subscriber.py с:

for d in mylist:
    p = multiprocessing.Process(target=subscriber.start,
                                args=(d.arg1, d.arg2, d.arg3))
    p.daemon=True
    p.start()

Мой скрипт также использует запись в Python для записи в общий файл журнала.

Что происходит с любым методом, так это то, что только процесс из последней итерации моего цикла остается фактически запущенным. Все, что мне нужно, это чтобы эти фоновые демоны работали "навсегда", но я могу получить только 1 экземпляр! [edit] Важно отметить, что я хочу, чтобы вызывающий поток завершился, оставив позади кучу запущенных демонов, работающих ..

Я много гуглил по стеку и в других местах, похоже, не могу найти подобный пример. Возможно, это мой питонский новичок .. мой подход совершенно неверен?

Среда: - Python-2.7, Ubuntu Linux

Ответы [ 2 ]

0 голосов
/ 22 марта 2012

Если вам действительно не нужно решение только для Python, крошечный сценарий оболочки может выполнить эту работу:

while read ARGS; do
  nohup ./subscriber.py $ARGS &
done < mylist.txt

, где mylist.txt содержит аргументы для каждого экземпляра subscriber.py в отдельной строке.

nohup «демонизирует» любую команду и & отодвигает ее на задний план.Это означает, что когда сеанс, породивший эту команду, заканчивается, команда nohup-ed становится дочерней по отношению к процессу init (PID = 1) и продолжает выполняться.

0 голосов
/ 21 марта 2012

2 вещи (помимо добавления процессов в список, который был упомянут выше):

  1. setting daemon = True фактически означает противоположность того, что вы ожидаете.из руководства: When a process exits, it attempts to terminate all of its daemonic child processes..Ага!Кроме того, демоны не могут порождать детей.

, что приводит меня к следующему: 2. Что вы должны сделать, это порождать детей, у которых daemon = False, и каждый из них при запуске будет демонизироваться с помощью fork().вот так:

    def daemonize():

        pid = os.fork()
        if pid != 0:
            sys.exit(0)


        return pid
...