在 unix 中只有一个进程打印,多处理 python

Only one process prints in unix, multiprocessing 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 中,我没有从进度函数 process p1.

得到任何输出

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

  • 使用 python -u 到 运行 脚本

    python -u 将取消缓冲 stdout 和 stderr。如果您可以接受,这是最简单的解决方案。

  • 使用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