python - 多线程登录

use*_*910 6 python logging multithreading

我正在尝试将多个线程的日志存储到单个文件中。但在我的日志文件中,来自不同线程的日志正在合并。我不想为不同的线程使用单独的日志文件。但是,当一个线程将日志写入文件时,另一个线程应该等待,直到前一个线程完成所有日志的写入。我尝试了不同的方法,但最终没有找到合适的解决方案。

from threading import Thread, current_thread
import threading
import time
import logging


logging.basicConfig(filename='LogsThreadPrac.log', level=logging.INFO)
logger = logging.getLogger(__name__)


def worker(val):
    print('value from the thread: {}'.format(val))
    logger.info('+++++++++++++++++++++++++++++++++++++++')
    print(current_thread().name)
    logger.info('value from the thread: {}'.format(val))
    time.sleep(3)
    logger.info('+++++++++++++++++++++++++++++++++++++++')

t1 = Thread(target=worker, args=[1,], name='th'+str(1))
t1.start()
t2 = Thread(target=worker, args=[2,], name='th'+str(2))
t2.start()
Run Code Online (Sandbox Code Playgroud)

小智 1

您可以将锁作为参数传递给您的工作人员,这样您就可以按照您想要的方式同步线程。

from threading import Thread, current_thread, Lock
import threading
import time
import logging


logging.basicConfig(filename='LogsThreadPrac.log', level=logging.INFO)
logger = logging.getLogger(__name__)
logger_lock = Lock()

def worker(val, lock):
    print('value from the thread: {}'.format(val))
    with lock:
        logger.info('+++++++++++++++++++++++++++++++++++++++')
        print(current_thread().name)
        logger.info('value from the thread: {}'.format(val))
        time.sleep(3)
        logger.info('+++++++++++++++++++++++++++++++++++++++')
t1 = Thread(target=worker, args=[1, logger_lock], name='th'+str(1))
t1.start()
t2 = Thread(target=worker, args=[2, logger_lock], name='th'+str(2))
t2.start()
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看有关锁用途和示例的更多信息

  • 此解决方案至少需要 6 秒才能完成两个工作线程,这与不使用线程所需的时间几乎相同。 (2认同)
  • 原因是线程正在访问同一个文件并等待它们。这不是真正的并发设计。 (2认同)