下面的脚本是抽象的。我的问题是关于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()
答案 0 :(得分:1)
您似乎误解了锁的工作原理。
锁不会锁定任何对象,它只能锁定线程执行。
第一个尝试进入with locker:
块的线程成功。
如果另一个线程试图进入一个with locker:
对象(具有相同的locker
对象),则会延迟直到第一个线程退出该对象,所以两个线程都无法更改该变量的值。同时封锁。
您的“共享资源”是您在块中更改的变量:如我所见,objects
和obj.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)
可以说,多处理锁不是锁,而是钥匙。 如果我们有几个代码块的一把钥匙,我们只能用它一次打开其中之一(锁或钥匙获取)。当密钥繁忙时,要求相同密钥的其他代码块将无法执行,将等待。因此,它只会阻塞一些代码,阻止解释器执行它。