我正在阅读教程以了解多线程,并且我看到人们覆盖run方法。我不清楚from the doc
此类表示在单独的控制线程中运行的活动。有两种方法可以指定活动:将可调用对象传递给构造函数,或者通过覆盖子类中的run()方法。不应在子类中重写其他方法(构造函数除外)。换句话说,只覆盖此类的 init ()和run()方法。
创建线程对象后,必须通过调用线程的start()方法启动其活动。这将在一个单独的控制线程中调用run()方法。**
那么如何创建一个界面,用户可以在自己的单独线程中选择doX
或doY
?例如,如果需要运行,我是否必须做这样的事情?
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()?
答案 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实例时设置目标参数,你不应该每次都创建自己的类。