2014-11-01 28 views
1

当我使用两个线程t1t2从Internet爬取某些东西,并将一些过滤的数据写入单个文件时,我使用Lock()实例来确保只有一个线程正在写入文件。我知道的是当t1.aquire()被调用时,t2.aquire()会将t2置于阻塞状态。 我想知道的是,现在在Python解释器中线程t2发生了什么。解释器会在每个时间段检查线程的状态吗?而且,解释器是控制分配给单个线程的CPU时间还是主机操作系统?线程在Python中阻塞时发生了什么?

+0

有点offtop,但仍然解释了很多关于蟒蛇跑步http://www.dabeaz.com/python/GIL.pdf – 2014-11-01 08:34:41

回答

0

任何系统调用都不可能中断对锁的acquire()方法。

获取()

获得锁,阻塞或非阻塞的。

当不带参数调用时(考虑t1):如果该线程已经拥有该锁,则递增递归级别,并立即返回。 否则,如果另一个线程拥有该锁,则阻塞直到该锁被解锁。 一旦锁定解锁(不属于任何线程),然后获取所有权,设置递归级别为1,然后返回。 如果有多个线程被阻塞,等待锁定解锁,则一次只能有一个线程能够获取该锁的所有权。在这种情况下没有返回值。

+0

谢谢,但我实际上知道你提到的东西,我想你在说话关于'RLock()'。我想弄清楚的是,当一个线程阻塞**时,场景下发生了什么,我的意思是说有事件循环来定期检查线程的阻塞状态吗? – Dragonly 2014-11-01 14:01:10

0

此问题的答案是特定于实现的(即取决于解释器和操作系统)。在CPython中,每个Python线程都直接映射到OS线程,因此调度由OS控制。锁定/解锁也由OS处理,而不是解释器。在Jython中,所有东西都在JVM下运行,JVM也将线程直接映射到本地线程。所以我不知道Python解释器自己处理调度和锁定的任何实现。

+0

非常感谢!你是否通过阅读源代码或某人的博客获得了所有这些信息? – Dragonly 2014-11-01 14:04:44

+0

@DragonWarrior在我看来,阅读文档和书籍是学习的最佳方式。我不认为源代码或博客可以使用一致的知识来源。 – kraskevich 2014-11-01 14:32:43