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