Python新进程内创建线程print重复输出及线程标识相关问题
问题解答
1. 重复打印的原因
首先排除你的猜测:子进程的print不会同步输出到父进程,你看到的所有THREAD开头的日志都是子进程内的线程输出的,日志中附带的PID都是子进程ID也可以验证这一点,父进程没有运行extra_threads相关代码,不会产生这类日志。
重复打印的根本原因是代码逻辑本身设计导致的:
threading.enumerate()会返回当前进程内所有存活线程的列表,你每个子进程内总共有4个存活线程:1个主线程 + 3个你创建的守护线程,所以每次遍历这个列表都会循环4次,对应4次打印。- 你在3个守护线程里同时运行
extra_threads函数,每次x自减1之后,3个线程会各自执行一次4次打印的循环,相当于x每变化一次,总共会产生3*4=12条日志,自然会出现大量相同X值的输出。
如果要避免重复打印,只需要去掉遍历所有线程的逻辑,改为直接打印当前线程即可:
def extra_threads(): x = 7 while x != 0: x -= 1 # 直接打印当前线程,不要遍历所有线程 print('THREAD:', threading.current_thread(), f'X Value: {x},', os.getpid())
2. 线程信息中数值的含义
你看到的started daemon后面的数字是线程标识符,对应Python线程对象的ident属性,本质是操作系统分配的POSIX线程ID(pthread_t),它的作用域是进程内唯一,而不是全局系统唯一,也不是内存地址。
不同进程的子线程出现相同ID是完全正常的:每个进程有独立的虚拟地址空间和线程ID命名空间,操作系统在不同进程内分配线程ID时可以复用相同数值。两个子进程的主线程ID不同只是和线程创建的时序、操作系统的分配策略有关,并不代表主线程ID就不能跨进程重复。
内容的提问来源于stack exchange,提问作者nova24
相关产品推荐
相关产品推荐

