代码之家  ›  专栏  ›  技术社区  ›  Zhang LongQI

在Python中,刷新是如何工作的,原因是什么?

  •  4
  • Zhang LongQI  · 技术社区  · 9 年前

    我有一个小的多线程程序,包括print语句。 如果我不改变 end 除了 \n . 如果我想使用其他字符而不是 \n个 ,我需要设置 flush True .

    所以我的问题是冲洗是如何工作的,原因是什么?

    #!/usr/bin/env python -u
    # -*- coding: utf-8 -*-
    from threading import Thread
    from queue import Queue
    from time import sleep
    
    
    def do_stuff(task):
        while not task.empty():
            sleep(1)
            print(task.get())  # works well
            # print(task.get(), end='\n')  # works well
            # print(task.get(), end=',', flush=True)  # works well
            # print(task.get(), end=',')  # works badly
            task.task_done()
    
    
    q = Queue(maxsize=0)
    for x in range(0, 5):
        q.put(x)
    
    num_threads = 2
    
    for i in range(num_threads):
        worker = Thread(target=do_stuff, args=(q,))
        worker.setDaemon(True)
        worker.start()
    
    q.join()
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   Niki van Stein akshay toshniwal    9 年前

    当您在Python中打印并使用逗号作为最后一个字符(不是作为字符而是作为分隔符号)时,输出不会被刷新,因为它正在等待另一个打印语句。这是打印命令中逗号的功能。如果您没有在打印命令中添加逗号,它应该在该过程中刷新并创建新行,实际上相反,它会创建新行并因此刷新。

        print(task.get(), end=',') 
    

    将打印而不换行,并在刷新缓冲区之前等待将创建新行的下一次打印。

     print(task.get())  
     print(task.get(), end='\n')  # works well
    

    将打印包括新行在内的内容并刷新缓冲区。

    这在许多控制台输出应用程序中非常常见,与C和C++的行为完全相同。换行符用作缓冲区清空的标志,如果缓冲区在每个字符后清空,则会消耗太多的cpu。

     print(task.get(), end=',', flush=True) 
    

    上面的工作是因为我们明确地说要刷新缓冲区。没有换行,但print语句将刷新缓冲区,因此立即打印。