Python 3.12子解释器教程中线程重复追加代码的作用疑问
Python子解释器示例中
list_thread.append(list_thread[i])的作用及问题分析 问题背景
我正在学习Python 3.12子解释器相关内容,遇到如下代码片段,其中的list_thread.append(list_thread[i])语句让我困惑:启动线程后将其重新追加到列表中有什么作用?这会不会破坏列表并影响后续执行步骤?我已尝试调试、AI工具分析,但仍不确定其预期效果。
def run_in_threads(total: int = 10): sub_interpreters = [] list_thread = [] for i in range(total): sub_interpreters.append(subinterpreters.create()) t = threading.Thread(target=thread_function, args=(sub_interpreters[i],)) list_thread.append(t) start = time.time() for i in range(total): list_thread[i].start() list_thread.append(list_thread[i]) # 存疑的代码 for t in list_thread: t.join() print(f"Test subinterpreter has total execution time {time.time() - start}") for i in range(total): subinterpreters.destroy(sub_interpreters[i])
解答
这行代码没有任何合理的业务作用,属于明显的代码错误,具体分析如下:
对列表结构的破坏
初始时list_thread包含total个线程对象,循环启动线程时,每执行一次list_thread.append(list_thread[i]),就会把当前启动的线程对象重复添加到列表末尾。以total=10为例,循环结束后list_thread会包含20个元素——前10个是原始线程,后10个是前10个的重复引用。对后续执行的影响
后续的for t in list_thread: t.join()会对每个线程执行两次join()操作:第一次是遍历前10个元素时,第二次是遍历后10个重复元素时。- 虽然Python中对已结束的线程重复调用
join()是安全的(不会抛出异常),但这完全是冗余操作,没有任何性能或功能上的收益。 - 更严重的是,这会误导代码阅读者,让逻辑变得混乱,且如果后续对
list_thread有依赖长度的操作,会直接引发错误。
- 虽然Python中对已结束的线程重复调用
正确的实现方式
这行代码应该被删除,正确的逻辑是启动所有线程后,直接遍历初始的线程列表执行join():start = time.time() for i in range(total): list_thread[i].start() for t in list_thread: t.join()
总结
这行代码是教程中的失误,既无合理作用,还会导致列表冗余、逻辑混乱,实际开发中应直接移除。
内容的提问来源于stack exchange,提问作者ölkjamin
相关产品推荐
相关产品推荐

