Python 线程在类中是如何工作的?
所以我找到了这个代码:Python 线程在类中是如何工作的?,python,multithreading,Python,Multithreading,所以我找到了这个代码: from threading import Thread class Example(Thread): def __init__(self): Thread.__init__(self) def run (self): print("It's working!") Example().start() 它使用另一个线程打印“它正在工作”,但这是如何工作的呢?我在类中找不到关于线程的任何信息。它与超类有关吗?您的\uuu i
from threading import Thread
class Example(Thread):
def __init__(self):
Thread.__init__(self)
def run (self):
print("It's working!")
Example().start()
它使用另一个线程打印“它正在工作”,但这是如何工作的呢?我在类中找不到关于线程的任何信息。它与超类有关吗?您的
\uuu init\uuu
方法是完全冗余的。实际上,您正在用自己的实现替换线程。
,其中您自己的实现只调用线程。
。如果将其删除,则不会有任何更改:
class Example(Thread):
def run (self):
print("It works!")
只需调用Example.run()
方法,因为您使用以下命令启动了线程:
start()
启动线程的活动 每个线程对象最多只能调用一次。它安排在单独的控制线程中调用对象的
run()
方法
另见:
run()
方法表示线程的活动 您可以在子类中重写此方法。标准的
run()
方法调用传递给对象构造函数的可调用对象作为目标参数(如果有),并分别使用args和kwargs参数中的顺序参数和关键字参数
您的
\uuuu init\uuuu
方法与此无关
现在,如果您在线程
子类中创建了一个\uuuuuuuu init\uuuuuu
方法,然后没有确保线程被调用,那么您就阻止了类设置重要的实例信息,破坏了实例:
>>> from threading import Thread
>>> class Example(Thread):
... def run (self):
... print("It works!")
...
>>> Example().start()
It works!
>>> class BrokenExample(Thread):
... def __init__(self):
... # not doing anything
... pass
... def run (self):
... print("It works!")
...
>>> BrokenExample().start()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/.../lib/python2.7/threading.py", line 737, in start
raise RuntimeError("thread.__init__() not called")
RuntimeError: thread.__init__() not called
>>从线程导入线程
>>>类示例(线程):
... def运行(自):
... 打印(“它有效!”)
...
>>>示例().start()
它起作用了!
>>>类Broker示例(线程):
... 定义初始化(自):
... # 什么也不做
... 通过
... def运行(自):
... 打印(“它有效!”)
...
>>>broken示例().start()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/…/lib/python2.7/threading.py”,第737行,开始
raise RUNTIMERROR(“未调用线程.\uuuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu())
运行时错误:未调用线程
因为这是一个常见的错误,所以Thread.start
方法会抛出一个自定义异常,明确地告诉您Thread.\uuuuu init\uuuuu
未执行。
方法是在初始化对象时调用的。当您执行-Thread.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
正如在评论中所说,您可以删除它,并且功能应该保持不变。在您的类中,\uuuuu init\uuuu()
是完全冗余的
执行此操作时将调用此方法-
Example()
为示例()
创建新对象时
在Example()
对象上执行-.start()
操作时,将调用run()
方法。这是通过方法完成的,从-
start()
启动线程的活动
每个线程对象最多只能调用一次。它安排在单独的控制线程中调用对象的run()方法
再添加一条打印语句,并将Example().start()
分成两行,以便您能够清楚地理解这一点-
>>> from threading import Thread
>>> class Example(Thread):
... def __init__(self):
... Thread.__init__(self)
... print("In __init__")
... def run (self):
... print("It's working!")
...
>>> e = Example()
In __init__
>>> e.start()
It's working!
你确定吗?你再试了吗?也许你犯了别的错误。你在这里做的事没有什么特别的。您是否创建了一个\uuuuu init\uuuu
方法,然后没有调用线程。\uuuuu init\uuuu
?请看一下(网上还有很多可用的方法)。谢谢!那么,基本上,示例中的线程(线程)已经初始化了一个线程?Thread类如何知道要运行什么函数?@MorrisCasper:Thread
类提供了所有功能,您只需要提供一个run()
方法。这是有文档记录的,调用.start()
将创建一个新线程,然后运行run
方法。如果在示例类中创建一个start函数,会发生什么情况?@MorrisCasper:您将覆盖thread.start()
方法,如果不调用原始线程,线程将不会启动,也不会调用run
。@MartijnPieters您好,您可以扩展这一部分吗:然后不确定线程。调用了uuu init uuuuuuuuu,那么您阻止类设置重要的实例信息,中断实例
您是指具有默认值的关键字参数,例如:self.\uu ident=None self.\uuu start=Event()self.\uuu stopped=False self.\uuuu block=Condition(Lock())self.\uu initialized=True
,这些参数在构造函数中没有调用?