【问题标题】:Python threads and stringsPython 线程和字符串
【发布时间】:2017-02-13 04:42:04
【问题描述】:

我是线程和多处理的新手。我有一些代码在其中启动一个进程,我希望输出显示类似这样的活动等待状态

wating....

代码与下面类似:

导入线程 进口时间

class ThreadExample(object):

    def __init__(self):
        self.pause = True
        threading.Thread(target=self.second_thread).start()
        #  Some other processes
        print("Waiting", end="")
        while self.pause:
            time.sleep(1)
            print(".", end="")
        print("Hooray!")

    def second_thread(self):
        print("timer started")
        time.sleep(3)
        self.pause = False
        print("timer finished")

if __name__ == "__main__":
    ThreadExample()

当我运行上面的代码时,我会收到输出:

timer started
Do something else..timer finished
.
Hooray!

没什么大惊小怪的,只是开头只出现了“计时器开始”,而其余的文字在结尾瞬间出现。

如果我将 print(".", end="") 行更改为 print("."),我会收到以下输出:

timer started
Do something else.
.
timer finished
.
Hooray

这些点以 1 秒为增量出现,这是我的意图。

有没有办法在没有 end="" 的情况下在一行中获得“等待...”?

其次,我猜这与 print() 函数的内部有关,如果不是,我应该以其他方式执行线程吗?我认为问题不在于 GIL,因为我尝试了 multiprocess.Process 并得到了相同的结果。

【问题讨论】:

    标签: python multithreading python-3.x buffering


    【解决方案1】:

    这可能是由于print 缓冲造成的。它在\n 和其他一些情况下(如缓冲区溢出或程序退出)被刷新。而不是print 试试这个:

    import sys
    
    def unbuffered_print(msg):
        sys.stdout.write(msg)
        sys.stdout.flush()
    
    ...
    unbuffered_print('.')
    

    无处不在。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2023-02-25
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多