线程在Python中阻塞时会发生什么?

时间:2014-11-01 07:42:13

标签: python multithreading

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

2 个答案:

答案 0 :(得分:0)

任何系统调用都无法中断锁定的acquire()方法。

获取()

获取锁定,阻止或非阻止。

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

答案 1 :(得分:0)

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