У меня есть класс HTTP Server, поддерживающий многопоточность, что при записи результата клиенту он записывает также некоторые журналы (модуль журнала). Это замедляет запрос, и поскольку методы POST/GET возвращаются только после появления «return», я должен написать журнал, прежде чем отправить результат. Я хочу сделать это, открыв еще один поток, который получит сообщение, и напишет журнал. Я хочу, чтобы мой объект ведения журнала был «статичным» или членом класса, который является одним и единственным, и делится на все потоки, которые могут получить блокировку на нем и использовать его.Многопоточность Python для записи журнала
import logging
LOG_FILENAME = 'babyServer.log'
class Logger(object):
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(levelname)-8s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='serverLog.log',
filemode='wa')
@classmethod
def Write(cls,level,log):
level = level.lower()
if level == 'error':
logging.error(log)
if level == 'info':
logging.info(log)
if level == 'exception':
logging.exception(log)
Так где-то за пределами этого файла, я в настоящее время вызова, такие как Logger.Write («Информация», «некоторая информация») Вместо этого, я хотел бы, чтобы этот призыв будет фактически открыть новую тему , которому принадлежит ссылка на единственное Logging I, настроенное в классе Logger.
Не могли бы вы пояснить (используя мой исходный код) Как поддерживать взаимные переменные из разных потоков с помощью механизма блокировки? Либо в очереди, либо через мьютекс. Я не уверен, как это происходит с общими переменными. – buddy123
Что позволяет избегать создания экземпляра каждый раз, когда возникает новая запись? Мне кажется, что его воссоздают каждый раз снова и снова – buddy123
Нить '_lt' создается и запускается только в функции' start() ', которую можно назвать только _once_. Если вы попытаетесь снова вызвать 'start()', это вызовет исключение.Единственное, что 'write()' делает, помещает что-то в очередь, не более того. –