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

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是线程安全的,所以来自不同线程的消息在输出中会有所区分。
运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43193719/article/details/89522373