_MainThread在这里对thread.run()意味着什么?

时间:2017-08-27 12:50:38

标签: python multithreading

这是一段python代码片段。

import threading

class myThread(threading.Thread):
        def __init__(self, threadID, name, counter):
                threading.Thread.__init__(self)
                self.threadID = threadID
                self.name = name
                self.counter = counter

        def run(self):
                currentTreadname = threading.currentThread()
                print "running in", currentTreadname

让我们的实例类myThread

thread = myThread(1,"mythrd",1)

并在其中调用run方法。

thread.run()
running in <_MainThread(MainThread, started 139982993762048)>

_MainThread在这里对thread.run()有什么意义? 在线程手册中:

The standard run() method invokes the callable object passed to the object’s constructor as the target argument.

1.这是两个对象,对于我的例子,第一个可调用对象意味着_MainThread
to the object’s constructor中的第二个对象意味着myThread的构造函数,对不对? 2.为什么在子类中运行方法可以调用父类?

thread.run()
running in <_MainThread(MainThread, started 139982993762048)>

thread是子类的实例 - myThread(1,“mythrd”,1),为什么thread.run()撤销_MainThread?

2 个答案:

答案 0 :(得分:1)

你应该调用Thread.start()方法。

import threading  

class myThread(threading.Thread):
    def __init__(self,threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):                                                                                                                                                                            
        currentTreadname = threading.currentThread()
        print "running in", currentTreadname

thread = myThread(1, "mythread", 1)
thread.start()

输出结果为:

running in <myThread(mythread, started 140140930873088)>
  

开始()

     

开始线程的活动。

     

每个线程对象最多只能调用一次。它安排对象的run()方法在一个单独的控制线程中调用。

     

run()的

     

表示线程活动的方法。

     

您可以在子类中覆盖此方法。标准的run()方法调用传递给对象构造函数的可调用对象作为目标参数(如果有),分别从args和kwargs参数中获取顺序和关键字参数。

正如doc所说, start()方法启动线程的活动,是的,这个活动是run()方法。

更新

标准run()方法调用传递给对象构造函数的可调用对象作为目标参数。

第二个对象是你的myThread实例,你是对的。但可赎回的对象不是你说的。检查这个threading.Thread定义:

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})
  

target是run()方法调用的可调用对象。默认为None,表示不调用任何内容。

可调用对象是您传递它的目标参数。有关这方面的更多信息,请参阅https://docs.python.org/2/library/threading.html

为什么您的代码会打印running in <_MainThread(MainThread, started 139982993762048)>

因为您没有调用Thread.start方法,所以它不会启动新线程。因此,如果您只是调用myThread.run,那么这是一个正常的对象方法调用。它在mainThread中调用。所以它会打印出来。

答案 1 :(得分:0)

如果您想正确使用线程,我认为您应该按照上面的GuangshengZuo回答,我试图提供您正在寻找的答案:
_MainThread是线程模块中的一个类。您可以轻松检查变量 currentTreadname 的类型,如下所示:

class myThread(threading.Thread):
    def __init__(self, threadID, name, counter):
            threading.Thread.__init__(self)
            self.threadID = threadID
            self.name = name
            self.counter = counter

    def run(self):
            currentTreadname = threading.currentThread()
            print("running in", type(currentTreadname))
thread = myThread(1,"mythrd",1)
thread.run()  

输出:

running in <class 'threading._MainThread'>