Найти - Пользователи
Полная версия: logging в многопоточном приложении
Начало » Python для новичков » logging в многопоточном приложении
1
Soteric
Здравствуйте.

Пытаюсь использовать 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()’ основной поток заканчивает свою работу и работу логера. И действительно, если усыпить основной поток, то ошибки не возникает. Однако на моем рабочем приложении, куда я пытаюсь добавить логирование, ошибка все равно имеет место, несмотря на то, что основной поток (в котором инициализировался логер) продолжает работать (это приложение с пользовательским интерфейсом, оно открыто и работает на момент ошибки). Кто-нибудь может объяснить принцип работы логера и потоков, и почему происходит такая ошибка?
Андрей Светлов
Да кто ж вас знает?
Для примера нужно было писать

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

Что происходит в вашем “рабочем приложении” - отсюда не разглядеть
Soteric
Пардон, я подумал что это проблема специфичная для питона.

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

Для будущих поколений: про SwingWorker в Jython читать здесь. Конкретно данная проблема решается использованием конструкции приведенной по ссылке: SwingUtilities.invokeLater(Runnable(createAndShowGUI))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB