Python多线程实现的两种核心方式:函数传参与类继承

远山来客
远山来客
发布时间:2026-10-13 | 4人浏览过
原创

本文详细解析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程序设计工作有所帮助。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表