【问题标题】:Custom class inheritance from threading.Thread从 threading.Thread 继承自定义类
【发布时间】:2017-05-10 04:02:46
【问题描述】:

我正在编写一个具有许多功能的类(因此是方法),但我需要这个类在线程内运行(类打开一个子进程)。我想使用通用的方式来声明基于线程的类,

class HiStackOverflow(threading.Thread):
     # Somethings...

但是,正如我所说,我的这个类有许多伪私有、常规和静态方法。当我声明它们时,我想避免错误地覆盖一些必要的threading.Thread 方法。

好吧,我总是可以检查threading.Thread 的目录,看看是否有任何方法名称重叠,但这似乎是一种不合适的处理方式。随着方法数量的增加,这可能不切实际。

我的问题是,这种实现可行吗?如果没有,我应该如何处理?我应该写一些包装类作为线程处理程序吗?

提前致谢。

【问题讨论】:

    标签: python multithreading python-2.7


    【解决方案1】:

    如果您担心您的类和threading.Thread 之间的命名空间冲突,我肯定会建议您使用组合而不是继承(或者将这两个功能完全分开)。只包装您需要的几个线程方法不应该有很大的开销,然后名称冲突就不会成为问题。

    它还可以更清晰地将类的功能与线程提供的功能分开。从长远来看,这很可能有助于理解您的代码。

    【讨论】:

    • 你的意思是像其他答案中的解决方案?
    • @Rockybilly -- 是的,这正是我的意思 :-) -- 虽然,我可能会建议您将类功能和线程完全分开。 m = MyClass(...); thread = Thread(target=m.run); thread.start() 看起来还不错,它简化了逻辑,明确了MyClass 的目的。
    【解决方案2】:

    Thread 继承并没有太多好处。你可以有一个工厂方法来创建线程,甚至可以让它的__init__ 来做。

    import threading
    import time
    
    class MyClass:
    
        def __init__(self):
            self._thread = threading.Thread(target=self.run)
            self._thread.start()
    
        def run(self):
            for i in range(5):
                print('worker thread', i)
                time.sleep(.5)
    
        def join(self):
            self._thread.join()
    
    my_obj = MyClass()
    for i in range(3):
        print('main thread', i)
        time.sleep(.5)
    my_obj.join()
    print('done')
    

    【讨论】:

      【解决方案3】:

      这句话似乎混杂了一些想法:

      但我需要这个类在线程中运行(类打开一个子进程)

      1. 类不“运行”。您可以启动一个执行某些类方法或实例方法的新线程。该类不必继承自Thread。它甚至不需要对正在运行的线程的引用。你只需开始在一个新线程中执行一些函数就完成了。

      2. 子进程与线程无关。你不需要一个做另一个。

      如果您担心覆盖某些内容,请查看文档 (https://docs.python.org/3/library/threading.html#thread-objects)。否则,如果您想保留对线程的引用,您可以随时这样做:

      class HiStackoverflow:
          def run(self):
              self.thread = Thread(target=self.entry_point)
              self.thread.start()
      
          def entry_point(self):
              ...
      

      【讨论】:

      • 我的意思是,类打开了一个连续的子进程,我需要子进程在一个线程中运行,抱歉造成误解,感谢提供信息。
      • @Rockybilly 子进程不在线程内运行。它们完全在当前进程之外运行。
      猜你喜欢
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 2015-06-20
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多