在unix中只打印一个进程,即多进程python



我有一个脚本,我正在加载一个文件,这需要一段时间,因为有相当多的数据要读取,并防止用户终止进程,我想显示某种加载指示。我认为这是一个学习如何使用多处理模块的好机会,所以我写了这个例子来测试模块:

import time, multiprocessing
def progress():
    delay = 0.5
    while True:
        print "Loading.",
        time.sleep(delay)
        print "b.",
        time.sleep(delay)
        print "b.",
        time.sleep(delay)
        print "r                        r",
    return
def loader(filename, con):
    # Dummy loader
    time.sleep(5)
    con.send(filename)
    con.close()
    return
if __name__ == "__main__":
    parrent_con, child_con = multiprocessing.Pipe()
    filename = "main.key"
    p1 = multiprocessing.Process(target=progress)
    p2 = multiprocessing.Process(target=loader, args=(filename, child_con))
    p1.start()
    p2.start()
    data = parrent_con.recv()
    p1.terminate()
    print "n", data

它像我期望的那样工作,当我在windows cmd中运行它时,它打印"Loading"并顺序添加点,直到加载器完成。但在unix中,我需要它的工作,我没有得到任何输出从进程函数,进程p1。

正如Mark和Dacav建议的那样,缓冲是问题所在。以下是一些可能的解决方案:

  • 使用python -u运行脚本

    python -u将取消对标准输出和标准错误的缓冲。如果你能接受,这是最简单的解决方案。

  • 使用sys.stdout.flush

    sys.stdout.flush将从缓冲区中刷新标准输出。

    delay = 0.5
    while True:
        print("Loading."),
        sys.stdout.flush()
        time.sleep(delay)
        print("b."),
        sys.stdout.flush()
        time.sleep(delay)
        print("b."),
        sys.stdout.flush()
        time.sleep(delay)
        print("r                        r"),
        sys.stdout.flush()
    return
    

最新更新