Как правльно выводить информацию в консоль при многопотоке?

Я пишу многопоточное(threading) консольное приложение на Python, мне необходимо выводить информацию в консоль из всех потоков,но при использовании print() не понятно к какому потоку относиться информация и вообще информация трудно читаема.
Как правильнее и удобнее выводить информацию?


Ответы (1 шт):

Автор решения: vadim vaduxa

%(processName)s и %(threadName)s для logging format

import logging, multiprocessing

formatter = '%(asctime)s levelname[%(levelname)s] processName[%(processName)s] threadName[%(threadName)s] pathname[%(pathname)s] funcName[%(funcName)s] lineno[%(lineno)d]\n%(message)s'
logging.basicConfig(level=logging.INFO, datefmt='%H:%M:%S', format=formatter, handlers=[logging.StreamHandler(), ],)

def threads(n):
    logging.info(f'mp {n}')
    with multiprocessing.pool.ThreadPool(processes=2) as p:
        p.map(lambda i: logging.info(f'th {i}'), range(3))

if __name__ == '__main__':
    multiprocessing.freeze_support()
    logging.info('Start')
    with multiprocessing.Pool(processes=2) as p:
        p.map(threads, range(2))

out:

13:08:05 levelname[INFO] processName[MainProcess] threadName[MainThread] pathname[C:\SCR\NEW_JIRA\sdas.py] funcName[<module>] lineno[13]
Start
13:08:06 levelname[INFO] processName[SpawnPoolWorker-2] threadName[MainThread] pathname[C:\SCR\NEW_JIRA\sdas.py] funcName[threads] lineno[7]
mp 0
13:08:06 levelname[INFO] processName[SpawnPoolWorker-2] threadName[Thread-1 (worker)] pathname[C:\SCR\NEW_JIRA\sdas.py] funcName[<lambda>] lineno[9]
th 0
13:08:06 levelname[INFO] processName[SpawnPoolWorker-2] threadName[Thread-1 (worker)] pathname[C:\SCR\NEW_JIRA\sdas.py] funcName[<lambda>] lineno[9]
th 1
13:08:06 levelname[INFO] processName[SpawnPoolWorker-2] threadName[Thread-1 (worker)] pathname[C:\SCR\NEW_JIRA\sdas.py] funcName[<lambda>] lineno[9]
th 2
13:08:06 levelname[INFO] processName[SpawnPoolWorker-2] threadName[MainThread] pathname[C:\SCR\NEW_JIRA\sdas.py] funcName[threads] lineno[7]
mp 1
13:08:06 levelname[INFO] processName[SpawnPoolWorker-2] threadName[Thread-6 (worker)] pathname[C:\SCR\NEW_JIRA\sdas.py] funcName[<lambda>] lineno[9]
th 0
13:08:06 levelname[INFO] processName[SpawnPoolWorker-2] threadName[Thread-6 (worker)] pathname[C:\SCR\NEW_JIRA\sdas.py] funcName[<lambda>] lineno[9]
th 1
13:08:06 levelname[INFO] processName[SpawnPoolWorker-2] threadName[Thread-6 (worker)] pathname[C:\SCR\NEW_JIRA\sdas.py] funcName[<lambda>] lineno[9]
th 2
→ Ссылка