第十章:使用进程、线程和协程提供并发性-threading:进程中管理并发操作-确定当前线程

线程命名与日志记录
本文探讨了在Python中如何使用threading模块为线程命名,并通过logging模块记录线程活动,便于调试和追踪。介绍了如何创建和启动线程,以及如何在日志消息中嵌入线程名。

10.3.2 确定当前线程
使用参数来标识或命名线程很麻烦,也没有必要。每个Thread实例都有一个带有默认值的名,该默认值可以在创建线程时改变。如果服务器进程中有多个服务线程处理不同的操作,那么在这样的服务器进程中,对线程命名就很有用。

import threading
import time


def worker():
    print(threading.current_thread().getName(),'Starting')
    time.sleep(0.2)
    print(threading.current_thread().getName(),'Exiting')

def my_service():
    print(threading.current_thread().getName(),'Starting')
    time.sleep(0.3)
    print(threading.current_thread().getName(),'Exiting')

t = threading.Thread(name='my_service',target=my_service)
w = threading.Thread(name='worker',target=worker)
w2 = threading.Thread(target=worker)  # Use default name

w.start()
w2.start()
t.start()

调试输出的每一行中包含有当前线程的名。线程名列中有“Thread-1”的行对应未命名的线程w2。
运行结果:
在这里插入图片描述
大多数程序并不实用print来进行测试,logging模块支持将线程名嵌入到各个日志消息中(使用格式化代码%(threadName)s)。通过把线程名包含在日志消息中,就能跟踪这些消息的来源。

import logging
import threading
import time

def worker():
    logging.debug('Starting')
    time.sleep(0.2)
    logging.debug('Exiting')

def my_service():
    logging.debug('Starting')
    time.sleep(0.3)
    logging.debug('Exiting')

logging.basicConfig(
    level=logging.DEBUG,
    format='[%(levelname)s] (%(threadName)-10s) %(message)s',
    )

t = threading.Thread(name='my_service',target=my_service)
w = threading.Thread(name='worker',target=worker)
w2 = threading.Thread(target=worker)  # use default name

w.start()
w2.start()
t.start()

而且logging是线程安全的,所以来自不同线程的消息在输出中会有所区分。
运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值