Python多线程实现的两种核心方式:函数传参与类继承
本文详细解析Python中实现多线程的两种主要方式:通过Thread对象传入目标函数,以及继承Thread类并重写run方法。文章对比了thread、threading及multithreading模块的演进,结合2.7版本前后的背景,提供了完整的代码示例与执行结果分析,帮助开发者掌握Python并发编程的基础技巧。
本文通过具体实例,深入剖析Python中实现多线程的两种主流方法,旨在为读者提供清晰的参考与学习路径。
当前Python生态中提供了多种多线程实现方案,包括thread、threading以及multithreading模块。其中,thread模块属于底层实现,而threading模块则在此基础上进行了封装与优化,使得线程操作更加便捷易用。
在Python 2.7版本之前,系统对线程的支持尚不完善,无法充分利用多核CPU的优势。不过,从2.7版本开始,官方已着手改进这一状况,并引入了multithreading模块。threading模块的核心在于将线程操作对象化,通过创建Thread类来实现线程控制。通常情况下,使用线程主要遵循以下两种模式:
- A. 定义需要执行的函数,并将该函数作为参数传递给Thread对象,由线程对象负责执行该函数;
- B. 继承Thread类,构建一个新的类,并将具体的执行逻辑编写在重写的run函数中。
接下来,本文将分别介绍上述两种实现方法的具体代码与运行效果。
第一种方法:创建函数并将其传入Thread对象中
t.py 脚本的具体内容如下:
import threading,time from time import sleep, ctime def now() : return str( time.strftime( '%Y-%m-%d %H:%M:%S' , time.localtime() ) ) def test(nloop, nsec): print 'start loop', nloop, 'at:', now() sleep(nsec) print 'loop', nloop, 'done at:', now() def main(): print 'starting at:',now() threadpool=[] for i in xrange(10): th = threading.Thread(target= test,args= (i,2)) threadpool.append(th) for th in threadpool: th.start() for th in threadpool : threading.Thread.join( th ) print 'all Done at:', now() if __name__ == '__main__': main()
执行该脚本后的输出结果如下:
starting at: 2018-08-29 09:34:16 start loop 0 at: 2018-08-29 09:34:16 start loop 1 at: 2018-08-29 09:34:16 start loop 2 at: 2018-08-29 09:34:16start loop 3 at: 2018-08-29 09:34:16
start loop 4 start loopat: 52018-08-29 09:34:16 at: 2018-08-29 09:34:16 start loop 6 at: start loop2018-08-29 09:34:16 7 at: 2018-08-29 09:34:16 start loop 8 start loopat: 9 2018-08-29 09:34:16at: 2018-08-29 09:34:16 looploop 1 done at: 2018-08-29 09:34:18 0 done at: 2018-08-29 09:34:18 loop 3 done at: 2018-08-29 09:34:18 looploop 5 done at: 2018-08-29 09:34:18 2 done at: 2018-08-29 09:34:18 loop 4 done at: 2018-08-29 09:34:18 looploop 7 done at: 2018-08-29 09:34:18 6 done at: 2018-08-29 09:34:18 looploop 98 done at:done at: 2018-08-29 09:34:182018-08-29 09:34:18
all Done at: 2018-08-29 09:34:18
第二种方法:创建继承自Thread类的子类
thclass.py 脚本的具体内容如下:
import threading , time
from time import sleep, ctime
def now() :
return str(time.strftime('%Y-%m-%d %H:%M:%S' , time.localtime()))
class myThread (threading.Thread) :
"""docstring for myThread"""
def __init__(self, nloop, nsec) :
super(myThread, self).__init__()
self.nloop = nloop
self.nsec = nsec
def run(self):
print 'start loop', self.nloop, 'at:', ctime()
sleep(self.nsec)
print 'loop', self.nloop, 'done at:', ctime()
def main():
thpool = []
print 'starting at:', now()
for i in xrange(10):
thpool.append(myThread(i, 2))
for th in thpool:
th.start()
for th in thpool:
th.join()
print 'all Done at:', now()
if __name__ == '__main__':
main()
执行该脚本后的输出结果如下:
starting at: 2018-08-29 09:36:02 start loop 0 at: Wed Aug 29 09:36:02 2018 start loop 1 at: Wed Aug 29 09:36:02 2018 start loop 2 at: Wed Aug 29 09:36:02 2018 start loop 3 at: Wed Aug 29 09:36:02 2018 start loop 4 at: Wed Aug 29 09:36:02 2018 start loop 5 at: Wed Aug 29 09:36:02 2018 start loop 6 at: Wed Aug 29 09:36:02 2018 start loop 7 at: Wed Aug 29 09:36:02 2018 start loop 8 at: Wed Aug 29 09:36:02 2018 start loop 9 at: Wed Aug 29 09:36:02 2018 loop 0 done at: Wed Aug 29 09:36:04 2018 loop 1 done at: Wed Aug 29 09:36:04 2018 looploop 23 done at:done at: Wed Aug 29 09:36:04 2018Wed Aug 29 09:36:04 2018
loop 4 done at: Wed Aug 29 09:36:04 2018 loop 5 done at: Wed Aug 29 09:36:04 2018 loop 6 done at: Wed Aug 29 09:36:04 2018 looploop loop 8 9 7 done at: done at: done at: Wed Aug 29 09:36:04 2018 Wed Aug 29 09:36:04 2018 Wed Aug 29 09:36:04 2018
all Done at: 2018-08-29 09:36:04
如果您对Python的其他并发处理或相关技术感兴趣,推荐查阅本站的《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》以及《Python常见数据库操作技巧汇总》等专题文章。
希望本文提供的两种实现方案及详细解析,能对您的Python程序设计工作有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









