如果我定义了一个扩展threading.Thread类和重写run的python线程,那么我可以调用run()而不是start(),并在调用者线程中使用它而不是单独的一个。
即
class MyThread(threading.thread):
def run(self):
while condition():
do_something()
这段代码(1)将在一个单独的线程中执行“run”方法
t = MyThread()
t.start()
此代码(2)将在当前线程中执行“run”方法
t = MyThread()
t.run()
在编写可以以任何一种方式执行的代码时,使用这种方法是否有任何实际缺点?是否可以直接调用Thread对象的“run”导致内存问题,性能问题或其他一些不可预测的行为?
换句话说,在调用MyThread类上的代码(2)和另一个相同的代码之间,有什么区别(如果有任何值得注意的话,我想会分配更多的内存将分配但是应该可以忽略不计)扩展“object”而不是“threading.Tread”的类
我猜一些(如果有的话)较低级别的差异可能取决于解释器。如果这是相关的,我主要对CPython 3。*
感兴趣答案 0 :(得分:1)
当您使用run
对象或threading.Thread
子类的对象时,threading.Thread
的行为没有区别,或者具有run
方法的任何其他类的对象:
threading.Thread.start
启动一个新线程,然后在此线程中运行run
。
run
启动调用线程中的活动,无论是主线程还是其他线程。
如果在主线程中运行run
,整个线程将忙于执行应该执行的任务run
,并且在任务完成之前你将无法做任何事情饰面。
那说不,不会有明显的差异,因为run
方法的行为与任何其他方法一样,并且在调用线程中执行。
答案 1 :(得分:0)
我查看了cpython 3中的code implementing threading.Thread类.init方法只是分配一些变量而不做任何与实际创建新线程相关的事情。因此我们可以假设它应该是安全的使用线程。以建议的方式使用线程对象。