Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 24, 2010 13:29:24

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

logging в многопоточном приложении

Здравствуйте.

Пытаюсь использовать logging в многопоточном приложении. При попытке из порожденного потока писать в лог, получаю ошибку. Вот код:

import logging
from threading import Thread

class Dummy(Thread):
def __init__(self):
super(Dummy, self).__init__()

def run(self):
logging.info('Hello!') # Вылетает здесь

def main():
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(levelname)s %(message)s',
filename='log.txt',
filemode='w')

Dummy().start()

if __name__ == '__main__':
main()
Вот ошибка:
Traceback (most recent call last):
File "D:\Developing\Platforms\jython252rc2\Lib\logging\__init__.py", line 750, in emit
self.stream.write(fs % msg)
File "D:\Developing\Platforms\jython252rc2\Lib\logging\__init__.py", line 750, in emit
self.stream.write(fs % msg)
ValueError: I/O operation on closed file
Почитав документацию, пришел к выводу, что после выполнения ‘Dummy().start()’ основной поток заканчивает свою работу и работу логера. И действительно, если усыпить основной поток, то ошибки не возникает. Однако на моем рабочем приложении, куда я пытаюсь добавить логирование, ошибка все равно имеет место, несмотря на то, что основной поток (в котором инициализировался логер) продолжает работать (это приложение с пользовательским интерфейсом, оно открыто и работает на момент ошибки). Кто-нибудь может объяснить принцип работы логера и потоков, и почему происходит такая ошибка?



Офлайн

#2 Дек. 24, 2010 13:55:37

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

logging в многопоточном приложении

Да кто ж вас знает?
Для примера нужно было писать

th = Dummy()
th.start()
th.join()

Что происходит в вашем “рабочем приложении” - отсюда не разглядеть



Офлайн

#3 Дек. 24, 2010 16:03:51

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

logging в многопоточном приложении

Пардон, я подумал что это проблема специфичная для питона.

Я использую Jython и на самом деле все оказалось из-за особенности реализации Swing.

Для будущих поколений: про SwingWorker в Jython читать здесь. Конкретно данная проблема решается использованием конструкции приведенной по ссылке: SwingUtilities.invokeLater(Runnable(createAndShowGUI))



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version