Python多线程基础:threading模块使用与实例解析

沈亦白
沈亦白
发布时间:2026-10-13 | 3人浏览过
原创

本文详细介绍Python中多线程的概念、优势及实现方式。重点讲解threading模块的使用,包括函数式与类式两种创建线程的方法。通过具体代码实例演示如何启动线程、处理线程同步以及使用线程锁确保主线程等待子线程结束,适用于需要提升程序响应速度和资源利用率的场景。

多线程概念与优势

多线程机制允许程序同时执行多个不同的任务流程,这种并发执行方式具备多项显著优势。

  • 通过将耗时较长的任务移至后台处理,可以有效优化资源分配。
  • 多线程能显著提升用户界面的交互体验。例如,当用户点击按钮触发特定事件时,程序可以在后台处理逻辑的同时,在前端显示进度条,直观展示处理进度。
  • 合理运用多线程技术,有可能加快程序的整体运行速度。
  • 在处理用户输入、文件读写或网络数据收发等需要等待的任务时,多线程尤为适用。此时,程序可以释放部分珍贵资源,如内存占用,从而提升系统效率。

线程与进程的区别

线程与进程存在本质区别。每个线程拥有独立的程序入口、执行序列和出口,但线程无法独立运行,必须依附于应用程序,由应用提供线程执行的控制权。

每个线程都维护着一组独立的CPU寄存器状态,这被称为线程上下文,它记录了线程上次运行时CPU寄存器的具体状态。

在线程上下文中,指令指针和堆栈指针寄存器最为关键。线程始终在进程的上下文中运行,这些地址指向拥有该线程的进程地址空间内的内存区域。

线程状态可以被抢占或中断。

当其他线程正在运行时,当前线程可以暂时挂起,即进入睡眠状态,这被称为线程的退让行为。

根据实现方式的不同,线程主要可分为两类:

内核线程:由操作系统内核负责创建和撤销。

用户线程:无需内核支持,直接在用户程序中实现的线程。

Python线程模块介绍

在Python 3中,常用的线程模块主要有两个:

  • _thread
  • threading(官方推荐使用)

旧的thread模块已被废弃,用户应使用threading模块替代。因此,在Python 3中无法再直接使用"thread"模块。为了保持向后兼容性,Python 3将原thread模块重命名。

重命名为"_thread"。

在Python中创建线程主要有两种方式:通过函数调用或使用类来封装线程对象。

线程创建与代码实例

函数式方法:通过调用_thread模块中的start_new_thread()函数来创建新线程。其语法结构如下:

_thread.start_new_thread ( function, args[, kwargs] )

参数具体说明如下:

  • function - 指定线程要执行的函数。
  • args - 传递给线程函数的参数元组,必须为tuple类型。
  • kwargs - 可选的关键字参数。

import _thread
from time import sleep
import datetime

def date_time_str():
  return datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
def loop_one():
  print('++++线程一开始于:',date_time_str())
  print('++++线程一休眠4秒')
  sleep(4)
  print('++++线程一休眠结束,结束于:',date_time_str())
      
def loop_two():
  print('++++线程二开始于:',date_time_str())
  print('++++线程二休眠2秒')
  sleep(2)
  print('++++线程二休眠结束,结束于:',date_time_str())
      
def main():
  print('-----所有线程开始时间:',date_time_str())
  _thread.start_new_thread(loop_one,())
  _thread.start_new_thread(loop_two,())
  sleep(6)
  print('------所有线程结束时间:',date_time_str())
      
if __name__=='__main__':
  main()

执行上述代码后的运行结果如下:

[python@master thread]$ python3 thread.py -----所有线程开始时间: 2018-11-08 19:07:54 ++++线程一开始于: 2018-11-08 19:07:54 ++++线程一休眠4秒 ++++线程二开始于: 2018-11-08 19:07:54 ++++线程二休眠2秒 ++++线程二休眠结束,结束于: 2018-11-08 19:07:56 ++++线程一休眠结束,结束于: 2018-11-08 19:07:58 ------所有线程结束时间: 2018-11-08 19:08:00

代码中的sleep(6)用于让主线程暂停,若主线程过早结束,会强制关闭正在运行的子线程,导致主线程退出时间不确定。为解决此问题,需引入线程锁机制,确保主线程在两个子线程均结束后再退出。相关代码如下:


import _thread
from time import sleep
import datetime

loops=[4,2]

def date_time_str():
  return datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
def loop(n_loop,n_sec,lock):
  print('线程(',n_loop,') 开始执行:',date_time_str(),',先休眠(',n_sec,')秒')
  sleep(n_sec)
  print('线程(',n_loop,')休眠结束,结束于:',date_time_str())
  lock.release()
def main():
  print('---所有线程开始执行...')
  locks=[]
  n_loops=range(len(loops))
  for i in n_loops:
    lock=_thread.allocate_lock()
    lock.acquire()
    locks.append(lock)
  for i in n_loops:
    _thread.start_new_thread(loop,(i,loops[i],locks[i]))
  for i in n_loops:
    while locks[i].locked():
     pass
  print('---所有线程执行结束:',date_time_str())
  
if __name__=='__main__':
  main()

加入线程锁后的运行结果如下:

[python@master thread]$ python3 thread2.py ---所有线程开始执行... 线程( 1 ) 开始执行: 2018-11-08 20:00:47 ,先休眠( 2 )秒 线程( 0 ) 开始执行: 2018-11-08 20:00:47 ,先休眠( 4 )秒 线程( 1 )休眠结束,结束于: 2018-11-08 20:00:49 线程( 0 )休眠结束,结束于: 2018-11-08 20:00:51 ---所有线程执行结束: 2018-11-08 20:00:51

上述示例中使用了线程锁来同步线程执行。

以上内容涵盖了Python多线程的基本概念与实战技巧,希望能为读者的学习提供有益参考。

本站声明

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

Python 相关产品和应用

全部下载

专题列表