Python多线程中Lock与RLock的区别与使用

栗子
栗子
发布时间:2026-10-11| 3人浏览过
原创

在Python多线程编程中,多个线程同时操作同一对象可能导致资源争用,进而引发死锁或读写混乱。本文详细解析threading.Lock()与threading.RLock()的区别,通过代码示例展示如何正确使用锁机制,避免死锁问题,确保数据一致性。

多线程资源争用问题

当多个线程同时访问和修改共享资源时,若缺乏同步机制,会导致数据不一致。例如,多个线程同时对全局变量进行累加操作,最终结果可能不符合预期。以下代码展示了未加锁情况下的资源争用问题:

#coding=utf8
import threading
import time

num = 0

def sum_num(i):
  global num
  time.sleep(1)
  num +=i
  print num

print '%s thread start!'%(time.ctime())

try:
  for i in range(6):
    t =threading.Thread(target=sum_num,args=(i,))
    t.start()

except KeyboardInterrupt,e:
  print "you stop the threading"

print '%s thread end!'%(time.ctime())

运行结果可能为:

Sun May 28 20:54:59 2017 thread start!
Sun May 28 20:54:59 2017 thread end!
01
3
710
15

可见,由于线程执行顺序不确定,累加结果出现混乱。

使用Lock解决资源争用

为解决上述问题,可以使用threading.Lock()创建基本锁对象。基本锁一次只能被一个线程锁定,其他线程需等待锁释放后获取。以下代码展示了如何使用Lock:

#coding=utf8
import threading
import time

num = 0

def sum_num(i):
  lock.acquire()
  global num
  time.sleep(1)
  num +=i
  print num
  lock.release()

print '%s thread start!'%(time.ctime())

try:
  lock=threading.Lock()
  list = []
  for i in range(6):
    t =threading.Thread(target=sum_num,args=(i,))
    list.append(t)
    t.start()

  for threadinglist in list:
    threadinglist.join()

except KeyboardInterrupt,e:
  print "you stop the threading"

print '%s thread end!'%(time.ctime())

运行结果为:

Sun May 28 21:15:37 2017 thread start!
0
1
3
6
10
15
Sun May 28 21:15:43 2017 thread end!

可见,使用Lock后,线程按顺序执行,结果正确。

Lock与RLock的区别

虽然Lock解决了资源争用问题,但在嵌套调用时,Lock会导致死锁。例如:

  lock.acquire()
  global num
  lock.acquire()
  time.sleep(1)
  num +=i
  lock.release()
  print num
  lock.release()

上述代码中,第二次lock.acquire()会导致死锁,因为锁已被当前线程持有,无法再次获取。

为解决此问题,可以使用threading.RLock()创建重入锁。RLock在同一线程中可被多次acquire,但acquire和release必须成对出现。调用n次acquire需调用n次release释放。

总结

本文详细解析了Python多线程中Lock与RLock的区别。Lock适用于简单场景,而RLock适用于嵌套调用场景。正确使用锁机制,可有效避免死锁和数据不一致问题,确保多线程程序的稳定性和可靠性。

以上就是对Python多线程中Lock与RLock锁详解的详细内容,更多关于Python并发编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。