Python多线程编程实战:创建、守护线程与锁机制详解
本文深入解析Python多线程编程核心概念,涵盖线程创建的两种主流方式、守护线程的生命周期管理以及互斥锁与递归锁的使用场景。通过具体代码示例,帮助开发者掌握后台任务处理、资源释放及线程安全控制技巧,提升程序运行效率与响应速度。
多线程
多线程机制允许程序同时执行多个不同的子任务,其运行优势主要体现在以下几个方面:
利用多线程可以将耗时较长的后台任务移至后台处理,从而优化用户界面体验。例如,当用户点击按钮触发特定事件时,界面可弹出进度条以直观展示处理进度。此外,多线程有助于加快程序整体运行速度。在处理用户输入、文件读写或网络数据收发等需要等待的操作时,线程机制尤为适用,它能有效释放内存等宝贵系统资源。
创建线程
在任何进程中,主线程是必然存在的核心执行单元。
创建线程的两种方法
继承Thread类,并重写它的run()方法
import threading
import time
cLass MyThread(threading.Thread):
def__ init__ (seLf, n):
super (MyThread, seLf).__ init__()
self.n = n
def run(self):
print('以类的方式创建多线程',self.n)
time.sleep(3)
r1 = MyThread(1)
r2 = MyThread(2)
r1.start()
r2.start()
调用threading库的Thread类
import threading
import time
def test(x):
print(x)
time.sleep(2)
if __name__=='__main__':
t1 = threading.Thread(target=test, args=(1,))
t2 = threading.Thread(target=test, args=(2,))
t1.start()
t2.start()
守护线程具有特殊的生命周期特征:当主线程以及所有非守护线程执行完毕并结束时,即使守护线程尚未完成其任务,也会随之终止(进入死亡状态),进而导致整个程序结束运行。
#守护线程
import threading
import time
def run(n):
print('task',n)
time.sleep(1)
print('3s')
time.sleep(1)
print('2s')
time.sleep(1)
print('1s')
if __name__ == '__main__': #主线程
t=threading.Thread(target=run,args=('t1',))
t.setDaemon(True) #设置子线程为守护线程,守护主线程。主线程结束,子线程也立马结束。必须在start() 方法调用之前设置
t.start()
print('end')
线程锁
1.互斥锁
#互斥锁
import threading
def run():
global x
lock.acquire() #申请锁
x+=1
lock.release() #释放锁
if __name__=='__main__':
x=0
res=[]
lock=threading.Lock() #实例化线程锁
for i in range(100): #100个线程
t=threading.Thread(target=run)
t.start()
res.append(t)
for t in res:
t.join()
print(x)
2.递归锁
import threading
def func(lock):
global gl_num
lock.acquire()
gl_num += 1
time.sleep(1)
print(gl_num)
lock.release()
if __name__ == '__main__':
gl_num = 0
lock = threading.RLock()
for i in range(10):
t = threading.Thread(target=func,args=(lock,))
t.start()
练手:
import threading
import time #导入时间模块
#线程一:输出当前的年月日时分秒
class myThread1(threading.Thread):
def run(self):
while (True):
print(time.asctime(time.localtime(time.time())))#输出实时时间
time.sleep(1)
#线程二:name每2秒打印输出4次结束
class myThread2(threading.Thread):#继承threading.Thread
def __init__(self,name):#继承父类的方法实现继承threading.Thread
super(myThread2, self).__init__()#super方法调用父类
self.name=name #实例化对象属性
def run(self):#重写Thread类中的run方法
for i in range(4):#for循环打印4次
print(self.name)
time.sleep(2)#打印一次delay两秒
if __name__ == '__main__':
#创建线程1和线程2并传入参数
x1 = myThread1()
x2 = myThread2("张三")
#开启线程
x1.start()
x2.start()
总结
本文到此结束,希望能为读者提供有价值的参考。如需了解更多技术内容,欢迎持续关注本站更新。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









