【问题标题】:Python: Multithreading: How can Python discern between different instances and threads with the same name?Python:多线程:Python 如何区分不同实例和同名线程?
【发布时间】:2018-12-17 11:59:16
【问题描述】:

我刚刚进入多线程。这是我在教程中某处找到的代码,我试图围绕它进行思考:

import threading, time

def f():
    print('thread function')
    time.sleep(1)

if __name__ == '__main__':
    for i in range(3):
        t = threading.Thread(target=f, name="t_thread")
        t.start()

我了解每个线程对象多次调用“start()”会导致 RuntimeError。

但是这段代码通过创建多个具有相同实例名称“t”和相同线程名称“t_thread”的类“Thread”实例然后在其上调用“start()”来创建多个线程。 Python 如何区分这些不同的实例和同名的线程?为什么在已经运行的实例上调用“start()”不会导致RuntimeError?

谢谢!

【问题讨论】:

  • "t" 不是 Thread 实例的名称。您的代码创建了三个Thread 实例,均名为“t_thread”。 “t”是一个局部变量的名称,它临时引用三个线程实例中的每一个——每次循环时都不同。

标签: python multithreading object


【解决方案1】:

线程的name 不会“做”任何事情,它可能对调用者有用……来自docs

仅用于识别目的的字符串。它没有语义。多个线程可以被赋予相同的名称。初始名称由构造函数设置。

Python 中的所有值/对象都有自己的标识,您可以使用 id 函数来实现这一点:

id(t)

应该为每个Thread 提供一些独特的东西。 Python's docs说:

CPython 实现细节:这是对象在内存中的地址。

【讨论】:

  • 这有助于我理解多个同名线程的问题,谢谢!多个具有相同名称的对象(在我的示例中为“t”)呢?