【问题标题】:Python 3 program to launch and track completion of a different program用于启动和跟踪不同程序的完成的 Python 3 程序
【发布时间】:2020-03-12 10:09:21
【问题描述】:

我正在编写一个 python 3 程序,它将启动另一个 python 程序来处理文件。我需要主程序随时保持任意数量的进程运行。每次其中一个进程完成时,我都会从文件中读取任意数字,以查看是否应该生成另一个进程。

产生进程的最佳方式是什么?我需要知道这个过程什么时候结束,这样我才能产生另一个,但仅此而已。而且,我真的希望生成的程序作为一个完全独立的进程执行。这些进程运行时间很长,并且会占用大量资源。我不需要知道程序的输出或退出状态,只要它退出就行了。

我考虑过使用由进程创建的互斥文件,但结果并不可靠。

有什么建议吗?

【问题讨论】:

    标签: python multiprocessing spawning


    【解决方案1】:

    我建议您查看多处理库。

    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 中运行(在本例中非常相似)。

    【讨论】:

      【解决方案2】:

      在 Python 中,您可以使用os.system()os.execl* familysubprocessmultiprocessing 来生成一个新进程。您可以根据自己的要求选择一种。

      父进程可以使用信号SIGCHLDos.waitpidos.wait* 来了解子进程何时终止。您可以查看subprocess.call()的源代码了解更多详情。

      linux中的SIGCHLD,是一个陷阱信号,表示当前进程启动的进程已经终止。

      最后,我举一个简单的例子来展示如何使用subprocess(Python 3)

      import subprocess
      
      subprocess.call(['ls', '-1'], shell=True)
      print('main exit')
      

      【讨论】:

      • 感谢您的建议。我主要关心的是哪种方法最完全地将子进程(内存和 CPU)与父进程分开。你对此有什么建议吗?
      • 你可以使用CGroup (Linux Control Group)来限制衍生进程的cpu和内存使用,支持你使用的是Linux。
      猜你喜欢
      • 2016-04-30
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      相关资源
      最近更新 更多