python threading.Lock()是否锁定需要锁定的所有内容?

时间:2018-12-06 17:27:02

标签: python python-2.7 python-multithreading

下面的脚本是抽象的。我的问题是关于FROM SIEBEL.S_SRC C left join SIEBEL.S_CAMP_CON M on C.ROW_ID = M.SRC_ID left join SIEBEL.S_DMND_CRTN_PRG T on T.ROW_ID = M.DCP_ID left join SIEBEL.S_CONTACT P on P.ROW_ID = M.CON_PER_ID left join SIEBEL.S_PRSP_CONTACT PR on PR.ROW_ID= M.PRSP_CON_PER_ID cross join (select 1 as n from dual union all select 2 from dual . . . ) x

的使用

锁定限制了对“共享资源”的访问,但是我对此感到担忧。在此示例中,我有 objects属性,这些对象是具有数组属性的对象列表。在某些情况下,依赖性会更进一步。

threading.Lock()是否“知道”需要锁定的所有内容?

还将显示以下脚本的输出。该脚本的目的主要是为了进行讨论-它不会失败,但是我不确定它正在锁定所需的一切。

Lock()

3 个答案:

答案 0 :(得分:1)

您似乎误解了锁的工作原理。

锁不会锁定任何对象,它只能锁定线程执行

第一个尝试进入with locker:块的线程成功。

如果另一个线程试图进入一个with locker:对象(具有相同的locker对象),则会延迟直到第一个线程退出该对象,所以两个线程都无法更改该变量的值。同时封锁。

您的“共享资源”是您在块中更改的变量:如我所见,objectsobj.array。您基本上是在保护它们免受并发访问(即-在没有适用于初学者的GIL的python版本中)只是因为一次只有一个线程可以更改它们

老朋友称其为关键部分,一次只能执行1个线程。

请注意,对于不同的资源使用相同的locker对象有点可疑。这样就有更多的机会陷入僵局/变慢了。

(如果您嵌套2个with locker调用,则会出现死锁-如果要这样做,则需要RLock)

就这么简单。

答案 1 :(得分:1)

不知道关于您尝试执行的任何操作。它只是一把锁,不在乎您放在何处。

例如,您可以声明:

lock = threading.Lock()

然后:

with lock:
    # Do stuff.

# In another thread
with lock:
    # Do something else

带有其他with lock的所有其他块都无法执行,除非当前块已完成,它与该块中的内容无关。因此,在本例中,假设第一个#Do stuff正在运行,而第二个线程命中with lock: # Do something else时它将不会运行,因为存在相同的锁。如果您要进行面向对象的编程,那么使用self.lock是个好主意。

答案 2 :(得分:1)

可以说,多处理锁不是锁,而是钥匙。 如果我们有几个代码块的一把钥匙,我们只能用它一次打开其中之一(锁或钥匙获取)。当密钥繁忙时,要求相同密钥的其他代码块将无法执行,将等待。因此,它只会阻塞一些代码,阻止解释器执行它。