启动线程后重新追加线程

问题描述 投票:0回答:1

我只是在关注关于 python 3.12 中子解释器的使用的 tutorial 。 教程中有以下代码片段:

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.append(list_thread[i])

线程启动后重新追加的目的是什么?这不会扭曲列表和以下步骤吗?

我已经尝试了常规步骤调试、chatgpt 等,但由于我不是 100% 确定想要的结果应该是什么,所以我真的不知道该相信什么..

谢谢各位的解答^_

python-multithreading python-3.12 python-subinterpreters
1个回答
0
投票

您引用的代码部分 -

    for i in range(total):
        list_thread[i].start()
        list_thread.append(list_thread[i])

确实只是教程作者的一些干扰。 正如您所指出的,这没有意义 - 并且所有工作中的代码都是因为对此列表中线程的额外引用的唯一影响是

.join()
被调用两次。由于
.join()
是幂等的,并且在已连接的线程上调用时没有任何效果,因此不会发生任何(坏的)情况)

如果您正在使用子解释器,我建议您 pip install

extrainterpreters
(免责声明:我是作者): 它不仅可以正确导入 Python 3.12 和 3.13 中的隐藏模块(如教程中所示),而且还为
threading.Thread
提供了一个直接包装器:您可以在代码中设置一个目标函数(在REPL 或在代码文件中),并在另一个解释器上的其他线程中运行它。

(但不幸的是,我还没有让通信原语正常工作,所以你不会得到与它们一起使用的正确的

Queue
Lock
- 但你可以检查在另一个解释器中运行的函数的结果)

© www.soinside.com 2019 - 2024. All rights reserved.