【问题标题】:what is the use of flushing in this instance?在这种情况下冲洗有什么用?
【发布时间】:2015-01-30 03:20:15
【问题描述】:

我只是好奇在这种特殊情况下刷新的用途是什么,因为它与我的应用程序是否正常运行无关。有问题的行位于第二类路由定义下,即“sys.stdout.flush()”行。那是用来做什么的?

class Route(object):
    def __init__(self):
        self.__route = [] #route information array

    def add_route(self, t): #user generated input array
        self.__route.append(t)
        print t.name
        sys.stdout.flush() #using "flush" method

    def compile_list(self): #route list compiler
        output = "" #sets addition variable
        for route in self.__route: #looping inputs
            output += "<div id='container'><div class='results-container'><span class='title'>Route name: </span>" + "<span class='result'>" + route.name + "</span></div><br />" + "<div class='results-container'><span class='title'>Stop One: </span>" + "<span class='result'>" + route.stop_one + "</span></div><br />" + "<div class='results-container'><span class='title'>Stop One Mileage: </span>" + "<span class='results-container'>" + route.stop_one_mileage + "</span></div><br />" + "<div class='results-container'><span class='title'>Stop Two: </span>" + "<span class='results-container'>" + route.stop_two + "</span></div><br />" + "<div class='results-container'><span class='title'>Stop Two: </span>" + "<span class='results-container'>" + route.stop_two_mileage + "</span></div><br />" + "<div class='results-container'><span class='title'>Stop Three: </span>" + "<span class='results-container'>" + route.stop_three + "</span></div><br />" + "<div class='results-container'><span class='title'>Stop Three: </span>" + "<span class='results-container'>" + route.stop_three_mileage + "</span></div><br />"
        return output #output return

#===================== Calculates the average of all three ==========================

    def calc_average(self): #average calculation
        stop_one_mileage = self.__route[0].stop_one_mileage #stop_one_mileage average
        stop_two_mileage = self.__route[0].stop_two_mileage #stop_two_mileage
        stop_three_mileage = self.__route[0].stop_three_mileage #stop_three_mileage
        avg = (int(stop_one_mileage) + int(stop_two_mileage) + int(stop_three_mileage))/3 #adds all three and divides by three
        return "<div class='results-container'><span class='title'>Average Mileage: </span><span class='results-container'>" + str(avg) + " miles</span></div>" #returns results


#===================== Calculates total of all three ==========================

    def calc_total(self): #calculates the total of all three
        stop_one_mileage = self.__route[0].stop_one_mileage #stop_one_mileage
        stop_two_mileage = self.__route[0].stop_two_mileage #stop_two_mileage
        stop_three_mileage = self.__route[0].stop_three_mileage #stop_three_mileage
        total = int(stop_one_mileage) + int(stop_two_mileage) + int(stop_three_mileage) #sets total of all three input
        return "<div class='results-container'><span class='title'>Total Mileage: </span><span class='results-container'>" + str(total) + " miles</span></div>" + "</div>" #returns results

class FormData(object): #form data object
    def __init__(self):
        self.name = ""
        self.stop_one = ""
        self.__stop_one_mileage = "" #makes sure mileage isn't zero
        self.stop_two = ""
        self.stop_two_mileage = "" #makes sure mileage isn't zero
        self.stop_three = ""
        self.stop_three_mileage = "" #makes sure mileage isn't zero

#===================== Getter/Setter ==========================

        @property #stop_one_mileage getter
        def stop_one_mileage(self):
            return self.__stop_one_mileage #returns the stop_one_mileage

        @stop_one_mileage.setter #stop_one_mileage setter
        def stop_one_mileage(self, m):
            if m <= 0:
                self.__stop_one_mileage = 10 #mileage set to 10 (nice round number)
            else:
                self.__stop_one_mileage = m #returns a value as long as the input is more than zero

【问题讨论】:

    标签: python io flush


    【解决方案1】:

    刷新保证输出将立即写入标准输出,而如果您不刷新,那么它可能(可能)停留在缓冲区中未指定的时间。

    字符串是否会保留取决于输出设备。一些输出设备是行缓冲的,所以带有换行符的print 会自动刷新缓冲区。但一般情况下并非如此,因此刷新确保它无论如何都会被写出。

    对于您的具体情况,是否有用取决于您是否关心打印可能不会立即生效的可能性。如果没有显式刷新,在最坏的情况下,输出可能不会出现,直到程序终止。如果您的程序将立即终止而无需用户交互,那么刷新不会有任何区别。

    【讨论】:

    • 好的,这对我来说很有意义。对于比我的规模更大的项目,这似乎是一个更有用的功能。也许对于某种游戏,时间滞后可能/将是一个问题。或者可能像亚马逊甚至 YouTube 这样的规模更大,如果某件事花费的时间超过一毫秒,人们就会变得暴躁。非常感谢@Rufflewind,我很欣赏这样的详细回答。另外,谢谢imareaver。
    【解决方案2】:

    它强制将 I/O 缓冲区完全写入标准输出。这在奇怪的竞争条件(缓冲区写入的确切时间很重要)或提前终止(如果没有刷新,缓冲区中的所有信息都将丢失)等情况下可能很重要。

    更多信息

    Usage of sys.stdout.flush() method

    https://en.wikipedia.org/wiki/Data_buffer

    【讨论】:

      猜你喜欢
      • 2016-05-12
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2014-05-05
      • 2017-03-05
      • 1970-01-01
      相关资源
      最近更新 更多