Python多线程基础:threading模块使用与实例解析
本文详细介绍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多线程的基本概念与实战技巧,希望能为读者的学习提供有益参考。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













