【问题标题】:What happens if a Python thread dies after acquiring a lock?如果 Python 线程在获得锁后死掉会发生什么?
【发布时间】:2014-09-06 06:52:44
【问题描述】:

在我的程序中,我有一个线程,它只是从服务器发送和获取更新。我尝试优雅地处理异常,但万一线程死亡,我只想重新启动它。问题是线程在使用某些资源之前获取锁(Threading.RLock 对象),我不知道如果线程在获取锁之后但在释放它之前死亡会发生什么。遇到这种情况怎么办?

【问题讨论】:

  • 什么是死亡?你是如何获得锁的?异常将自动释放作为with 语句上下文管理器获取的任何锁,因为它们在堆栈中传播,但如果死亡意味着死锁或者您获取的锁不安全,您可能无法获得如此好的保证。
  • @user2357112 在我无法处理的异常中死亡,线程退出,调用 mythread.is_alive() 返回 false。你能解释更多关于线程和 with 语句的信息吗?
  • @user2357112 非常好的点。您可能应该重写您的两个 cmets 作为答案。

标签: python multithreading thread-safety


【解决方案1】:

如果你acquire your locks using with statements:

with whatever_lock:
    do_stuff()

或在正确构造的 try-finally 语句中(不太推荐,但有时是必要的):

whatever_lock.acquire()
try:
    do_stuff()
finally:
    whatever_lock.release()

那么如果发生异常,随着异常传播到获取锁的控制流构造之外,锁将被释放。

这意味着如果你做对了,死去的线程通常会在死去时释放所有的锁。另一方面,如果您没有安全地获取锁,或者如果线程死亡可能意味着死锁而不是未处理的异常,那么锁可能会在线程死亡时保持获取。

【讨论】:

  • 这正是我所需要的!我有点像牛仔编码,这是我第一次使用线程并且没有真正阅读过如何安全地获取锁。我注意防止任何死锁或竞争条件,但容易受到未经处理的异常的影响。如果我需要尝试获取锁但有指定的超时,那么 try-finally 语句似乎是可行的方法。我真的不知道如何使用 with 语句来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
相关资源
最近更新 更多