这是一段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?
答案 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'>