Python 3 программа для запуска и отслеживания завершения другой программы - PullRequest
0 голосов
/ 12 марта 2020

Я пишу программу python 3, которая запустит другую программу python для обработки файлов. Мне нужна основная программа, чтобы поддерживать произвольное количество процессов, запущенных в любое время. Я буду читать произвольное число из файла каждый раз, когда один из процессов завершает свою работу, чтобы увидеть, должен ли быть запущен другой процесс.

Каков наилучший способ порождать процессы? Мне нужно знать, когда процесс завершится, чтобы я мог породить другой, но это все. И мне бы очень хотелось, чтобы порожденная программа выполнялась как совершенно отдельный процесс. Процессы долго выполняются и используют много ресурсов. Мне не нужно знать о состоянии выхода или выхода из программы, просто о том, что она вышла.

Я рассмотрел использование взаимных файлов, созданных процессами, но у меня были хитрые результаты с ними.

Есть предложения?

Ответы [ 2 ]

1 голос
/ 12 марта 2020

В Python вы можете использовать os.system () , os.execl * семейство , подпроцесс , многопроцессорное породить новый процесс. Вы можете выбрать один из них в соответствии с вашими требованиями.

Родительский процесс может использовать сигнал SIGCHLD или os.waitpid , os.wait * для знать, когда дочерний процесс завершен. Вы можете увидеть исходный код subprocess.call () для получения более подробной информации.

SIGCHLD в linux, является сигналом ловушки, который указывает на процесс, запущенный текущим процессом, завершен.

В заключение приведу простой пример, показывающий, как использовать подпроцесс (Python 3)

import subprocess

subprocess.call(['ls', '-1'], shell=True)
print('main exit')
1 голос
/ 12 марта 2020

Я бы порекомендовал вам заглянуть в многопроцессорную библиотеку.

https://docs.python.org/3/library/multiprocessing.html

Он порождает отдельные python процессы, которые вы можете отслеживать и общаться с использованием очередей.

#!/usr/bin/env python3

import multiprocessing

class MyFancyClass(object):

    def __init__(self, name):
        self.name = name

    def do_something(self):
        proc_name = multiprocessing.current_process().name
        print('Doing something fancy in %s for %s!' % (proc_name, self.name))


def worker(q):
    obj = q.get()
    obj.do_something()


if __name__ == '__main__':
    queue = multiprocessing.Queue()

    p = multiprocessing.Process(target=worker, args=(queue,))
    p.start()

    queue.put(MyFancyClass('Fancy JimF'))

    # Wait for the worker to finish
    queue.close()
    queue.join_thread()
    p.join()

Пример взят из этой статьи https://pymotw.com/2/multiprocessing/communication.html, но немного обновлен для работы в python3 (в этом случае он очень похож).

...