Python: запись / добавление в файл внутри ошибки класса потока - PullRequest
1 голос
/ 09 марта 2011

Я пытаюсь периодически записывать некоторые измерения в текстовый файл.(некоторые журналы сортировки).

Для периодического запуска функции существует класс RepeatTimer.И чтобы запустить функцию обновления файла, у меня есть функция VTlog (), как показано ниже.

class RepeatTimer(Thread):
    def __init__(self, interval, function, iterations=0, args=[], kwargs={}):
        Thread.__init__(self)
        self.interval = interval
        self.function = function
        self.iterations = iterations
        self.args = args
        self.kwargs = kwargs
        self.finished = Event()

    def run(self):
        count = 0
        while not self.finished.isSet() and (self.iterations <= 0 or count < self.iterations):
            self.finished.wait(self.interval)
            if not self.finished.isSet():
                self.function(*self.args, **self.kwargs)
                count += 1

    def cancel(self):
        self.finished.set() 



def LogVT():
    tgt_picks = [t1,t2] #modify here for selective targets
    for tgt in tgt_picks:
        tt = tgt
        file = ('c:/vtlogs_%s.txt' % str(tt.target_name))
        x = str(tt.voltage('v_1p05_gfx_uncore')) + ', ' + str(tt.voltage('v_1p5_sm')) + ', ' + str(tt.temperature('pch_temp'))
        q = time.strftime('%m/%d/%y, %H:%M:%S')
        filehandle = open(file, 'a')
        filehandle.write('\n' + q + ', ' + x)
        filehandle.close()
        time.sleep(3)


logtimer = RepeatTimer(60.0, LogVT)
logtimer.start()

'x' и 'q' работают отдельно при запросе в автономном режиме.t1 и t2 - это некоторые системы, соединенные с устройством измерения напряжения и температуры.API уже запущен.

Моя проблема в том, что я получаю это во время выполнения:

Traceback (most recent call last):
  File "C:\Python25\lib\logging\__init__.py", line 750, in emit
    self.stream.write(fs % msg)
ValueError: I/O operation on closed file

Любое объяснение, почему ??

1 Ответ

0 голосов
/ 09 марта 2011

Я думаю, вам следует проверить, правильно ли было open() и действительно ли возвращен дескриптор файла или произошла ошибка, прежде чем делать какие-либо вызовы write() или close() для этого дескриптора файла.

------------ CORRECTION -----------

Вы должны проверить, правильно ли было open(), но не для резонанса, о котором я говорил выше. open() вызовет IOError, если не сможет открыть файл, так что это не имеет никакого отношения к вашей проблеме.

Как предположил Мэт, причиной этого, вероятно, являются нити. попробуйте что-то вроде:

...

    def run(self):
        count = 0
        # creating a lock
        lock = Lock()
        while not self.finished.isSet() and (self.iterations <= 0 or count < self.iterations):
            self.finished.wait(self.interval)
            if not self.finished.isSet():
                # call function with lock
                self.function(lock, *self.args, **self.kwargs)
                count += 1

...

def LogVT(lock):
    tgt_picks = [t1,t2] #modify here for selective targets
    for tgt in tgt_picks:
        tt = tgt
        file = ('c:/vtlogs_%s.txt' % str(tt.target_name))
        x = str(tt.voltage('v_1p05_gfx_uncore')) + ', ' + str(tt.voltage('v_1p5_sm')) + ', ' + str(tt.temperature('pch_temp'))
        q = time.strftime('%m/%d/%y, %H:%M:%S')
        # lock while doing file operations
        lock.acquire()
        filehandle = open(file, 'a')
        filehandle.write('\n' + q + ', ' + x)
        filehandle.close()
        # unlock
        lock.release()
        time.sleep(3)

...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...