2014-09-06 47 views
2

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

+0

什么构成死亡?你如何获得锁?异常会自动释放作为'with'语句上下文管理器获取的任何锁,因为它们传播堆栈,但如果死亡意味着死锁或者您不安全地获取锁,则可能无法获得如此好的保证。 – user2357112 2014-09-06 07:11:07

+0

@ user2357112在异常中死亡得到抛出,我不处理,线程退出,并调用mythread.is_alive()返回false。你能解释更多关于线程和with语句吗? – AndrewH 2014-09-06 07:25:58

+0

该文档显示如何使用锁作为上下文管理器并解释'with'语句:https://docs.python.org/2/library/threading.html#using-locks-conditions-and-semaphores-in-随声明https://docs.python.org/2/tutorial/errors.html#predefined-clean-up-actions http://legacy.python.org/dev/peps/pep-0343/ https: //docs.python.org/2/reference/compound_stmts.html#with – user2357112 2014-09-06 07:28:54

回答

4

如果acquire your locks using with statements

with whatever_lock: 
    do_stuff() 

或以适当制造的try-finally语句(较少推荐的,但有时是必要的):

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

那么如果出现异常,锁将被释放因为异常从获取锁的控制流构造中传播出去。

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

+0

这正是我需要的!我曾经是牛仔编码,这是我第一次使用线程,并没有真正阅读如何安全地获取锁。我注意防止任何僵局或竞赛条件,但容易受到不受欢迎的例外。 如果我需要尝试获取一个锁定但具有指定的超时时间,try-finally语句似乎就是要走的路。我真的不明白我会如何使用陈述。 – AndrewH 2014-09-09 15:46:19

相关问题