You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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])

解答

这行代码没有任何合理的业务作用,属于明显的代码错误,具体分析如下:

  1. 对列表结构的破坏
    初始时list_thread包含total个线程对象,循环启动线程时,每执行一次list_thread.append(list_thread[i]),就会把当前启动的线程对象重复添加到列表末尾。以total=10为例,循环结束后list_thread会包含20个元素——前10个是原始线程,后10个是前10个的重复引用。

  2. 对后续执行的影响
    后续的for t in list_thread: t.join()会对每个线程执行两次join()操作:第一次是遍历前10个元素时,第二次是遍历后10个重复元素时。

    • 虽然Python中对已结束的线程重复调用join()是安全的(不会抛出异常),但这完全是冗余操作,没有任何性能或功能上的收益。
    • 更严重的是,这会误导代码阅读者,让逻辑变得混乱,且如果后续对list_thread有依赖长度的操作,会直接引发错误。
  3. 正确的实现方式
    这行代码应该被删除,正确的逻辑是启动所有线程后,直接遍历初始的线程列表执行join():

    start = time.time()
     for i in range(total):
         list_thread[i].start()
    
     for t in list_thread:
         t.join()
    

总结

这行代码是教程中的失误,既无合理作用,还会导致列表冗余、逻辑混乱,实际开发中应直接移除。

内容的提问来源于stack exchange,提问作者ölkjamin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:19:53