在我的程序中,我有一个线程只是发送并从服务器获取更新。我尝试优雅地处理异常,但为了防止线程死亡,我只想重新启动它。问题是线程在使用某些资源之前获取锁(Threading.Lock对象),并且我不知道如果线程在获取锁之后但在释放之前死亡会发生什么情况。我该如何处理这种情况?如果Python线程在获取锁后死亡会发生什么?
2
A
回答
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
相关问题
- 1. 如果一个ThreadPool线程死亡会发生什么?
- 2. 线程分配内存,主进程死亡,会发生什么?
- 3. 锁定状态,如果线程死亡
- 4. 在Java中,如果一个线程死亡,另一个线程会发生什么?
- 5. 在python线程死亡时?
- 6. 未能获取锁的线程会发生什么情况?
- 7. 为什么它不会发生死锁?
- 8. 如果在获得互斥锁后发生中断,会发生什么情况
- 9. 在Akka中,如果我观察()一个死亡的ActorRef,会发生什么?
- 10. Python线程死锁
- 11. perl:当主进程死亡时线程不会死亡
- 12. 死锁在Python线程
- 13. 线程试图获取pthread_mutex_lock(&mutex)如果他们没有获取锁,会发生什么?
- 14. 线程结束后会发生什么?
- 15. 获取node.js进程死亡?
- 16. 监控进程在handle_call完成之前死亡时会发生什么?
- 17. Java线程死亡
- 18. 如果某个线程死于临界区域内会发生什么情况?
- 19. 如果父/主线程死掉,std :: async调用会发生什么
- 20. 当进程死亡时会消失的Python锁
- 21. 为什么页面加载后不会进程死亡? - Django
- 22. 在Linux中发生死Java线程发生了什么?
- 23. OutOfMemoryError会导致线程死亡吗?
- 24. 如果某个进程意外死亡,进程内存会发生什么情况?
- 25. SwingWorker(线程)不会死亡(到达“return null;”后仍然存在)?
- 26. Ruby线程重定向后死亡
- 27. 如果线程试图获取它已经拥有的锁,会发生什么情况?
- 28. 如果当前线程崩溃,那么readwritelock会发生什么
- 29. Python线程和锁定:死锁
- 30. 为什么Cookie会话保持死亡
什么构成死亡?你如何获得锁?异常会自动释放作为'with'语句上下文管理器获取的任何锁,因为它们传播堆栈,但如果死亡意味着死锁或者您不安全地获取锁,则可能无法获得如此好的保证。 – user2357112 2014-09-06 07:11:07
@ user2357112在异常中死亡得到抛出,我不处理,线程退出,并调用mythread.is_alive()返回false。你能解释更多关于线程和with语句吗? – AndrewH 2014-09-06 07:25:58
该文档显示如何使用锁作为上下文管理器并解释'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