监控多进程

时间:2017-05-06 12:37:14

标签: python-3.x python-multiprocessing

我尝试制作一个程序,要求用户输入,读取器功能打印输入,而输入功能不会阻止读取器功能。

我能做什么

import multiprocessing as mp
import time


def ProInput(queue):
    while True:
        if queue.empty():
            print("{} waiting an item".format(mp.current_process().name))
        else:
            item = queue.get()
            if(item == 'exit'):
                break;
            else:
                print("{} processing {}".format(mp.current_process().name, item))
        time.sleep(1)



def InputRead(queue):
    while True:
        f = input("Insert your input :")
        queue.put(f)
        if(f == 'exit'):
            break;
        print("You insert {} into the system".format(f))

if __name__ == '__main__':
    st = time.time()
    q = mp.Queue()

    OutputSys = mp.Process(target=ProInput, name='Reader', args=(q,))
    OutputSys.daemon = True
    OutputSys.start()

    InputRead(q)

    et = time.time()
    OutputSys.join()
    print('Total running time {}'.format(et-st))

是否可以在第一个终端中使用Input功能而在另一个终端中使用Reader功能?我的意思是,我可以在不受Reader函数干扰的情况下给出输入。My Program Looks like

常见问题

问:为什么不删除Reader中的打印功能?你的问题解决了!

答:我需要在程序中监控这个过程。

聚苯乙烯。 :随意修正我的语法,因为我的英语仍然破碎。

1 个答案:

答案 0 :(得分:0)

请澄清你的意思,说“另一个终端”。多处理本身并不处理终端(TTY / PTY)分配或管理,并且进程有多个用户可访问的终端有点不寻常。

如果我理解你的问题,你基本上希望监控你的程序(健康检查)。有两种常见的一般方法:

  • 如果您只需要在某处输出状态信息,请考虑写入某些日志(例如文件,syslog或某些UDP套接字 - 考虑使用logging模块,因为它非常灵活)。然后设置您的监控解决方案将监视日志文件(或在套接字上侦听新消息)并做出相应的反应。

    即。而不是print做这样的事情:

    import logging
    
    def setup_logger():
        # Just a very primitive example. Not a good code.
        logger = logging.getLogger("proinput")
        logger.setLevel(logging.DEBUG)
        # Or `fh = logging.StreamHandler(sys.stdout)`
        # to get the same effect as your previous print calls
        fh = logging.FileHandler("proinput.log")
        fh.setLevel(logging.DEBUG)
        formatter = logging.Formatter(
            "[%(asctime)s] %(process)d[%(processName)s] "
            "%(name)s (%(funcName)s): %(levelname)s: %(message)s"
        )
        fh.setFormatter(formatter)
        logger.addHandler(fh)
        return logger
    
    def pro_input(queue):
        logger = setup_logger()
        while True:
            ...
            logger.info("Waiting for an item")
            ...
            logger.info("Processing: %s", repr(item))
    

    上面的例子非常原始,不灵活,不能很好地扩展。查看logging documentation(特别是教程和configuring logging部分 - 这就是我说日志记录很灵活时的意思)和a question on using logging with multiprocessing以获取更多信息。

    如果你真的想拥有两个终端,这种方法也会允许你的“多终端”情况。只需使用预先创建的终端设备(例如,打开一个新的控制台窗口,运行tty并输出类似/dev/pts/9的内容)作为输出文件,并在通过命令行启动程序时传递此信息选项或环境变量。

  • 另一个选择是实现一个特殊的服务器(例如HTTP或简单的TCP),它允许监控软件连接并查询状态。我们的想法是在您的计划中设立一个独立的流程,专门为外部世界提供状态信息。

    这对于像您这样的交互式软件来说并不常见,但对于服务器来说,这是一种非常流行的方法,可以实现健康检查。如果您的软件“无头”并且用户输入仅用于原型设计,请考虑检查Prometheus。它有一个很好的检测库,可以通过HTTP轻松测量和输出数据。

您选择哪种方法(被动观看与主动查询)取决于您的监控解决方案和您的个人偏好。