10.3.5 派生线程
开始时,Thread要完成一些基本初始化,然后调用其run()方法,这会调用传递到构造函数的目标函数,要创建Thread的一个子类,需要覆盖run()来完成所需的工作。
import threading
import logging
class MyThread(threading.Thread):
def run(self):
logging.debug('running')
logging.basicConfig(
level=logging.DEBUG,
format='(%(threadName)-10s) %(message)s',
)
for i in range(5):
t = MyThread()
t.start()
run()的返回值将被忽略。
运行结果:
由于传递到Thread构造函数的args和kwargs值保存在私有变量中(这些变量名都有前缀"__"),所以不能很容易地从子类访问这些值。要向一个定制的线程类型传递参数,需要重新定义构造函数,将这些值保存在子类可见的一个实例属性中。
import threading
import logging
class MyThreadWithArgs(threading.Thread):
def __init__(self,group=None,target=None,name=None,
args=(),kwargs=None,*,daemon=None):
super().__init__(group=group,target=target,name=name,
daemon=daemon)
self.args = args
self.kwargs = kwargs
def run(self):
logging.debug('running with %s and %s',
self.args,self.kwargs)
logging.basicConfig(
level=logging.DEBUG,
format='(%(threadName)-10s) %(message)s',
)
for i in range(5):
t = MyThreadWithArgs(args=(i,),kwargs={'a':'A','b':'B'})
t.start()
MyThradWithArgs使用的API与Thread相同,不过类似于其他定制类,这个类可以轻松地修改构造函数方法,以取得更多参数或者与线程用途更直接相关的不同参数。
运行结果: