python threading模块:重写run()是必要的

时间:2014-11-23 12:12:01

标签: python python-multithreading

我正在阅读教程以了解多线程,并且我看到人们覆盖run方法。我不清楚from the doc

  

此类表示在单独的控制线程中运行的活动。有两种方法可以指定活动:将可调用对象传递给构造函数,或者通过覆盖子类中的run()方法。不应在子类中重写其他方法(构造函数除外)。换句话说,只覆盖此类的 init ()和run()方法。

     

创建线程对象后,必须通过调用线程的start()方法启动其活动。这将在一个单独的控制线程中调用run()方法。**

那么如何创建一个界面,用户可以在自己的单独线程中选择doXdoY?例如,如果需要运行,我是否必须做这样的事情?

class MyCls(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)

    def doX(self):
        while True:
            time.slee(10)
            return 'x'

    def doY(self):
        while True:
            time.slee(10)
            return 'y'

    def run(self, dowhat):
        assert dowhat.lower() in 'xy', "Can only do X or Y"
        return getattr(self,'do'+dowhat.upper())()

用法:

o1 = MyCls()
o1.start()
o1.run('x')
#separate thread
o2 = MyCls()
o2.start()
o2.run('y')

有没有方法可以方便地在自己的线程中执行o1.doX() doX()?

2 个答案:

答案 0 :(得分:2)

在这种情况下,您甚至不需要子类化线程。简单地

from threading import Thread 
class Thingy(object):
    @staticmethod
    def doX():
        print ("X")
    @staticmethod
    def doY():
        print ("Y")
worker1 = Thread(target=Thingy.doX).start()
worker2 = Thread(target=Thingy.doY).start()

编辑: 我想你的意思就像生成器那样每次都在线程中进行计算吗?这或多或少是你想要的吗?

from threading import Thread
import time

class Thingy(object):
    def doX(self,  rng):
        for i in range(0, rng):
            worker1 = Thread(target=self.doY)
            worker1.start()
            worker1.join()
            yield self.item

    def doY(self):
        self.item = time.time()

gen = Thingy().doX(5)
print (gen.next(), str(type(gen)))
print (list(gen))

结果

(1416756265.972083, "<type 'generator'>")
[1416756265.972913, 1416756265.973542, 1416756265.974052, 1416756265.974545]

答案 1 :(得分:0)

  

那么如何创建一个界面,用户可以在自己独立的线程中选择doX或doY?

正如您在文档中看到的那样,他们不支持在方法开始运行中提供args,kwargs。所以请在课堂构造中设置你的参数。

当您致电开始时,它会启动新线程并执行功能运行之前被您覆盖。如果您想在同一个线程中调用您的功能,请致电运行 通常开发人员只是在初始化新的Thread实例时设置目标参数,你不应该每次都创建自己的类。