当我使用两个线程t1
和t2
从Internet爬取某些东西,并将一些过滤的数据写入单个文件时,我使用Lock()实例来确保只有一个线程正在写入文件。我知道的是当t1.aquire()
被调用时,t2.aquire()
会将t2
置于阻塞状态。 我想知道的是,现在在Python解释器中线程t2
发生了什么。解释器会在每个时间段检查线程的状态吗?而且,解释器是控制分配给单个线程的CPU时间还是主机操作系统?线程在Python中阻塞时发生了什么?
回答
任何系统调用都不可能中断对锁的acquire()方法。
获取()
获得锁,阻塞或非阻塞的。
当不带参数调用时(考虑t1):如果该线程已经拥有该锁,则递增递归级别,并立即返回。 否则,如果另一个线程拥有该锁,则阻塞直到该锁被解锁。 一旦锁定解锁(不属于任何线程),然后获取所有权,设置递归级别为1,然后返回。 如果有多个线程被阻塞,等待锁定解锁,则一次只能有一个线程能够获取该锁的所有权。在这种情况下没有返回值。
谢谢,但我实际上知道你提到的东西,我想你在说话关于'RLock()'。我想弄清楚的是,当一个线程阻塞**时,场景下发生了什么,我的意思是说有事件循环来定期检查线程的阻塞状态吗? – Dragonly 2014-11-01 14:01:10
此问题的答案是特定于实现的(即取决于解释器和操作系统)。在CPython中,每个Python线程都直接映射到OS线程,因此调度由OS控制。锁定/解锁也由OS处理,而不是解释器。在Jython中,所有东西都在JVM下运行,JVM也将线程直接映射到本地线程。所以我不知道Python解释器自己处理调度和锁定的任何实现。
非常感谢!你是否通过阅读源代码或某人的博客获得了所有这些信息? – Dragonly 2014-11-01 14:04:44
@DragonWarrior在我看来,阅读文档和书籍是学习的最佳方式。我不认为源代码或博客可以使用一致的知识来源。 – kraskevich 2014-11-01 14:32:43
- 1. 当一个线程被阻塞时,其他线程会发生什么?
- 2. 当一个线程在wait()上阻塞时被中断会发生什么?
- 3. python为什么在一个线程中真正阻塞另一个线程
- 4. 为什么Task.Factory.FromAsync阻塞UI线程?
- 5. 为什么Handler.Post阻塞主线程
- 6. 确定什么是阻塞UI线程
- 7. 在.Net中阻塞线程
- 8. 阻止阻塞的线程阻塞
- 9. 在Linux中发生死Java线程发生了什么?
- 10. 为什么单独线程中的TidTCPClient阻塞主线程?
- 11. 为什么线程在我使用Apache-Commons-Pool时被阻塞?
- 12. 为什么NSTimer在另一个线程运行时被阻塞?
- 13. GC在用户线程中踢球时发生了什么?
- 14. Python:为什么recv()在阻塞模式下没有阻塞?
- 15. 为什么我的python线程互相阻塞
- 16. 将线程阻塞转换为f中的非线程阻塞#
- 17. 什么时候FileInputStream.read()阻塞?
- 18. 阻塞的线程是否会导致进程阻塞?为什么和如何?
- 19. 阻塞队列不阻塞线程?
- 20. 当executorservice关闭时,运行/阻塞的runnables会发生什么()
- 21. 在python中发生了什么b = a [:]?
- 22. MessageBeep线程阻塞
- 23. 阻塞线程 - Java
- 24. 非阻塞线程
- 25. Java线程阻塞
- 26. 为什么我的后台工作线程阻塞UI线程?
- 27. 为什么主线程的Looper.loop()不会阻塞UI线程?
- 28. 中止阻塞线程
- 29. 阻塞线程中断
- 30. 为什么我的异步计时器阻塞UI线程?
有点offtop,但仍然解释了很多关于蟒蛇跑步http://www.dabeaz.com/python/GIL.pdf – 2014-11-01 08:34:41