Форум сайта python.su
20
Здравствуйте.
Пытаюсь использовать 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
Офлайн
14
Да кто ж вас знает?
Для примера нужно было писать
th = Dummy()
th.start()
th.join()
Что происходит в вашем “рабочем приложении” - отсюда не разглядеть
Офлайн
20
Пардон, я подумал что это проблема специфичная для питона.
Я использую Jython и на самом деле все оказалось из-за особенности реализации Swing.
Для будущих поколений: про SwingWorker в Jython читать здесь. Конкретно данная проблема решается использованием конструкции приведенной по ссылке: SwingUtilities.invokeLater(Runnable(createAndShowGUI))
Офлайн