本文共 1711 字,大约阅读时间需要 5 分钟。
在上一节中,我们学习了如何通过封装Thread类来实现线程编程。然而,这种方法并不常见,通常我们更倾向于从Thread派生一个子类,并在该类中包含线程相关的代码。这种方法更为灵活,也更符合常见的编程实践。以下是具体的代码示例:
上一节介绍了封装Thread类的对象
这一次学习一种更常用的封装方法,从Thread派生一个子类,然后将线程有关代码放到此类中
这种常规做法非常常见,先看代码:
# ——创建时间:2019.3.2——# 多线程import threadingfrom time import ctime, sleepclass MyThread(threading.Thread): # 重写父类构造方法 # 三个参数名称分别是线程函数名、线程函数参数、线程名 def __init__(self, func, args, name=''): # 调用父类构造方法,并传入参数 super().__init__(target=func, name=name, args=args) # 重写父类run方法 def run(self): self._target(*self._args) def fun(self, index, sec): print('开始执行', index, '时间', ctime()) sleep(sec) print('执行完毕', index, '时间', ctime()) def main(): print('开始', ctime()) thread1 = MyThread(fun, (10, 4), '线程一') thread2 = MyThread(fun, (20, 2), '线程二') thread1.start() thread2.start() print(thread1.name) print(thread2.name) thread1.join() thread2.join()if __name__ == '__main__': main()有bug?让我想想
在上述代码中,我们定义了一个名为MyThread的子类,继承自threading.Thread。为了方便起见,我们重写了Thread类的构造方法和run方法。以下是需要注意的几点:
构造方法的参数顺序:在Python中,Thread类的构造方法定义为def __init__(self, target=None, args=(None,), name='Thread-<N>')。因此,在我们的MyThread类中,__init__方法的参数顺序应与Thread类的构造方法保持一致。即,target参数应放在args之前。
线程执行目标:在run方法中,我们直接调用了self._target(*self._args)。如果目标函数需要更多的参数,需要确保args中包含足够的参数。
线程名称和参数的传递:在创建MyThread实例时,需要正确传递目标函数和参数。例如,在main()函数中,我们传递了fun函数以及相关参数。
线程启动和等待:确保调用start()方法启动线程,并在main()函数中调用join()方法等待线程完成,以避免程序结束后线程未完成任务。
如果发现上述代码存在问题,可能是因为在__init__方法中参数的传递顺序不正确,或者目标函数未能正确接收参数。建议在编写多线程代码时,仔细检查参数传递和线程目标的定义是否正确。
如果你发现具体错误,可以提供更多日志信息或错误提示,我可以帮助你进一步分析和解决问题。
转载地址:http://blofk.baihongyu.com/