Моя практика в многопоточном Python довольно бедна. Итак, теперь я изучаю, как получать информацию о журналах из нескольких потоков. Я видел много разных подходов, но хочу начать с простого, я думаю. Таким образом, задача состоит в создании нескольких потоков и данных журнала из каждого из них. Чтобы распознать источник журналов, я хочу поместить некоторый пользовательский тег в вывод журнала. Я знаю, что logging lib имеет атрибуты LogRecord досягаемости (thread, threadName и т. Д.), И он работает хорошо. Итак, у меня есть пример (logging-from-multiple-threads) и внесите некоторые изменения. Вот полный код:Реализация пользовательских протоколов вывода из нескольких потоков в python
импорт каротаж импорт резьб время импорта
logger = logging.getLogger()
syslog = logging.StreamHandler()
formatter = logging.Formatter('%(project)s : %(thread)x '
'%(levelname)-8s '
'%(message)s')
syslog.setFormatter(formatter)
logger.setLevel(logging.DEBUG)
logger.addHandler(syslog)
class ContextFilter(logging.Filter):
def __init__(self, project):
super(ContextFilter, self).__init__()
self.project = project
def filter(self, record):
record.project = self.project
return True
def worker(args):
while not args['stop']:
logging.debug('Hi from {}'.format(args['project']))
time.sleep(0.5)
def main():
projects = ['project_1', 'project_2']
info = {'stop': False}
threads = []
for project in projects:
info['project'] = project
logger.addFilter(ContextFilter(project))
thread = threading.Thread(target=worker, args=(info,))
thread.start()
threads.append(thread)
while True:
try:
logging.debug('Hello from main')
time.sleep(1.75)
except KeyboardInterrupt:
info['stop'] = True
break
for t in threads:
t.join()
if __name__ == '__main__':
main()
А вот результаты вывода:
project_2 : 7fa627e77700 DEBUG Hi from project_2
project_2 : 7fa6293d0700 DEBUG Hello from main
project_2 : 7fa627676700 DEBUG Hi from project_2
project_2 : 7fa627e77700 DEBUG Hi from project_2
project_2 : 7fa627676700 DEBUG Hi from project_2
project_2 : 7fa627e77700 DEBUG Hi from project_2
project_2 : 7fa627676700 DEBUG Hi from project_2
project_2 : 7fa627e77700 DEBUG Hi from project_2
project_2 : 7fa627676700 DEBUG Hi from project_2
project_2 : 7fa6293d0700 DEBUG Hello from main
project_2 : 7fa627e77700 DEBUG Hi from project_2
На самом деле, это не то, что я ожидал. Можете ли вы принести мне некоторое представление о том, что не так?
, пожалуйста, не забудьте принять один из ответов –