使用python线程作为普通对象

时间:2016-08-20 11:18:20

标签: python multithreading

如果我定义了一个扩展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。*

感兴趣

2 个答案:

答案 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方法只是分配一些变量而不做任何与实际创建新线程相关的事情。因此我们可以假设它应该是安全的使用线程。以建议的方式使用线程对象。