Linux下Python多进程线程ID相同的原因及跨平台差异问询
多进程线程ID重复及跨平台差异问题解答
你在VMware的Linux系统中运行了以下Python代码:
import threading from multiprocessing import Process import os def task1(): print("process1:", os.getpid(), "thread1:", threading.get_ident()) def task2(): print("process2:", os.getpid(), "thread2:", threading.get_ident()) if __name__=='__main__': p1 = Process(target=task1) p2 = Process(target=task2) p1.start() p2.start() p1.join() p2.join()
输出结果:
process1: 17106 thread1: 140006283367232 process2: 17107 thread2: 140006283367232
在Windows系统中运行相同代码,输出为:
process1: 18156 thread1: 23484 process2: 26452 thread2: 25688
1. 线程ID跨进程重复≠同一线程,不影响多核利用
你不用担心这两个进程会跑在同一个线程或同一个CPU核心上:
- 线程ID的唯一性仅限进程内部:不同进程拥有完全独立的地址空间和线程ID命名空间。Linux下
threading.get_ident()返回的是POSIX线程库的内部标识(本质是线程控制块的指针),每个新进程的主线程都可能拿到相同的指针值,但这只是虚拟地址的巧合,它们对应的是完全不同的线程实体。 - 两个Process是独立的执行单元:操作系统会将这两个进程调度到不同的CPU核心上并行运行,你的多核利用需求完全可以实现,线程ID的重复只是表象,不影响实际执行逻辑。
2. 跨平台输出差异的核心原因:线程ID实现机制不同
Windows和Linux对线程ID的定义逻辑完全不同:
- Linux:
threading.get_ident()基于pthread_self()实现,返回的是进程内唯一的线程标识,不具备系统全局唯一性,所以不同进程的主线程ID很容易重复。 - Windows:
threading.get_ident()调用系统APIGetCurrentThreadId(),返回的是系统全局唯一的线程ID,每个线程的ID在整个系统中都独一无二,因此不同进程的线程ID必然不同。
内容的提问来源于stack exchange,提问作者JING
相关产品推荐
相关产品推荐

