Python中如何判断同一线程?ident相同但pid不同是否为同一线程?
Python线程ident相同但PID不同的问题解析
问题场景
运行以下Python代码:
import os import threading import time def send_pic(txt): print(f'send_pic {txt} pid:{os.getpid() } tid:{threading.current_thread().ident}') time.sleep(4) print('send_pic %s ..ok ' % txt) return 'ok' def send_video(txt): print(f'send_video {txt} pid:{os.getpid() } tid:{threading.current_thread().ident}') time.sleep(3) print('send_video %s ..ok ' % txt) return 'ok'
得到输出:
send_pic @8@ pid:23548 tid:140735887565696 send_video #9# pid:23542 tid:140735887565696
核心疑问
- 这类ident相同但pid不同的线程是否为同一线程?
- 为何会出现ident相同的情况?
- 该如何判断是否为同一线程?
问题解答
1. 是否为同一线程?
绝对不是同一线程。PID是进程ID,每个进程的PID在系统中唯一,不同PID意味着两个线程属于完全独立的进程。线程是进程内的执行单元,跨进程的线程不可能是同一个实体。
2. 为何会出现ident相同的情况?
threading.current_thread().ident的唯一性仅局限于当前进程内部,系统不保证不同进程间的线程ident不重复:
- 线程ident通常是操作系统分配的轻量级进程ID(LWP ID),或是Python解释器内部维护的标识。
- 当进程退出后,系统会回收其线程的LWP ID等资源,后续启动的其他进程的线程可能被分配到同一个ID,导致跨进程的线程ident重复。
- Python的
ident字段本质只保证进程内唯一,无跨进程全局唯一性。
3. 如何判断是否为同一线程?
判断两个线程是否为同一实体,需同时满足两个条件:
- 两个线程的PID完全相同(属于同一个进程)
- 两个线程的ident完全相同
在同一进程内,更可靠的方式是直接比较线程对象:使用threading.current_thread()获取的线程对象,直接用==比较即可——同一线程的对象是同一个实例,不同线程则是不同实例。例如:
t1 = threading.Thread(target=send_pic, args=("@8@",)) t2 = threading.Thread(target=send_video, args=("#9#",)) print(t1 == t2) # 输出False,说明不是同一线程
内容的提问来源于stack exchange,提问作者oddstar2018
相关产品推荐
相关产品推荐

