用于python的IPC机制

时间:2015-07-31 09:31:47

标签: python ipc

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

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

' A'必须执行' B'超过100次,但有时B会介于两者之间,所以当时我无法继续整个操作。现在我想要一个IPC机制来查找' B'被击中,如果它被击中,那么我可以自动杀死该过程并重新开始。

注意:我不想使用mmap,文件,pickle

1 个答案:

答案 0 :(得分:2)

您可以使用subprocess.Popen创建子进程,然后使用subprocess.Popen.poll以特定的时间间隔检查子进程是否已完成,而不是os.system。如果没有,你可以使用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打印一次。