【问题标题】:IPC mechanisms for pythonpython的IPC机制
【发布时间】:2015-07-31 09:31:46
【问题描述】:

A 和 B 是同一个目录下的两个 python 程序。当前程序 A 正在运行,现在程序 B 将使用以下指令从 A 执行。

os.system("python B.py & echi $!")

'A'必须执行'B'超过100次,但有时B会在其间挂起,所以当时我无法继续整个操作。现在我想要一个 IPC 机制来查找“B”是否被击中,如果它被击中,那么我可以自动终止该进程并重新开始。

注意:我不想使用 mmap、files、pickle

【问题讨论】:

    标签: python ipc


    【解决方案1】:

    您可以使用 subprocess.Popen 创建子进程来代替 os.system,然后使用 subprocess.Popen.poll 以特定间隔检查子进程是否已完成。如果没有,你可以使用 subprocess.Popen.kill 杀死它。例如,您可以将其包装在这样的函数中。

    import subprocess
    import threading
    import time
    
    def process(*args):
        return_code, threshold = None, 5
    
        def reader():
            try:
                while 1:
                    process.status_check_time = time.time()
                    process.process.stdout.readline()
            except:
                pass
    
        try:
            return_code = process.process.poll()
            curr_time = time.time()
    
            if return_code != None:
                raise Exception()
    
            if curr_time - process.status_check_time > threshold:
                process.process.kill()
                raise Exception()
        except:
            process.process = subprocess.Popen(args, bufsize = 0, shell = False, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
            (threading.Thread(target = reader)).start()
    
        return return_code
    

    现在调用process('/path/to/your/program') 应该根据给定的阈值(在本例中为 5 秒)(重新)启动您的程序。为避免重新启动子进程,应每 5 秒向 stdout/stderr 打印一些内容。

    【讨论】:

    • 其实子进程要做一整天的报废操作,所以只有拿到struct才应该杀掉,不能不知道是不是在报废就瞎杀。
    • 那么您可能可以定期从子进程写入状态代码并从父进程读取它。读操作可以在一个单独的线程中完成,如果在固定的时间段内没有读到任何内容,主线程可以终止子进程并启动一个新的。
    • 在我的程序中,子进程正在从网络上抓取所有数据,因此它必须运行一整天。在该子进程发生任何事情之间,它不会向其父进程返回任何值,它只会挂起而不返回任何东西。所以如果它在中间被击中,我已经发现了。那么我该怎么做呢?
    猜你喜欢
    • 1970-01-01
    • 2016-06-01
    • 2012-01-13
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2011-01-15
    • 2023-03-08
    相关资源
    最近更新 更多