如何在 Python 中锁定部分方法
How to lock part of method in Python
我想锁定部分方法("Waiting to acquire lock" 之后的部分应该只在第一个线程释放锁后 运行 )。发生的情况是两个线程 运行 独立地与 lock.acquire() 无关。
我不明白为什么这不起作用。 Whosebug 中的示例与此类似但不完全相同。只是一瞥为什么我需要这个:我没有明确的共享资源,我只是想防止 2 python 线程从 运行ning 相同的代码,因为在我工作的系统中上,他们可能会使系统处于不稳定状态。
import threading, time
def test(name):
lock = threading.Lock()
print(name + " - Starting thread")
print(name + " - Waiting to acquire lock")
lock.acquire(True)
try:
print(name + " - Lock acquired!")
for i in range(10):
print(name + " - " + str(i))
print("")
time.sleep(1)
finally:
lock.release()
print(name + " - Lock released")
def main():
t1 = threading.Thread(target=test, args=["#1_Thread"])
t2 = threading.Thread(target=test, args=["#2_Thread"])
t1.start()
time.sleep(3)
t2.start()
main()
您创建的锁定对象是您的函数的本地对象,因此不共享:
lock = threading.Lock()
将您的锁定义为全局锁,它将被共享
import threading, time
lock = threading.Lock()
def test(name):
global lock
print(name + " - Starting thread")
print(name + " - Waiting to acquire lock")
lock.acquire(True)
try:
print(name + " - Lock acquired!")
for i in range(10):
print(name + " - " + str(i))
print("")
time.sleep(1)
finally:
lock.release()
print(name + " - Lock released")
def main():
t1 = threading.Thread(target=test, args=["#1_Thread"])
t2 = threading.Thread(target=test, args=["#2_Thread"])
t1.start()
time.sleep(3)
t2.start()
main()
您的线程各自创建并锁定自己的独立锁:
def test(name):
lock = threading.Lock()
...
那不会提供互斥。两个线程可以同时加不同的锁,不会冲突;只有当两个线程试图锁定 相同的 锁时,锁才会做任何事情。
创建一个锁并将其提供给两个线程。当您使用它时,with
语句通常是一种比 finally
块更干净的方式来确保清理。 That'll lock the lock when execution enters the with
and unlock it when execution leaves:
import threading, time
def test(name, lock):
print(name + " - Starting thread")
print(name + " - Waiting to acquire lock")
with lock:
print(name + " - Lock acquired!")
for i in range(10):
print(name + " - " + str(i))
print("")
time.sleep(1)
print(name + " - Lock released")
def main():
lock = threading.Lock()
t1 = threading.Thread(target=test, args=["#1_Thread", lock])
t2 = threading.Thread(target=test, args=["#2_Thread", lock])
t1.start()
time.sleep(3)
t2.start()
main()
我想锁定部分方法("Waiting to acquire lock" 之后的部分应该只在第一个线程释放锁后 运行 )。发生的情况是两个线程 运行 独立地与 lock.acquire() 无关。
我不明白为什么这不起作用。 Whosebug 中的示例与此类似但不完全相同。只是一瞥为什么我需要这个:我没有明确的共享资源,我只是想防止 2 python 线程从 运行ning 相同的代码,因为在我工作的系统中上,他们可能会使系统处于不稳定状态。
import threading, time
def test(name):
lock = threading.Lock()
print(name + " - Starting thread")
print(name + " - Waiting to acquire lock")
lock.acquire(True)
try:
print(name + " - Lock acquired!")
for i in range(10):
print(name + " - " + str(i))
print("")
time.sleep(1)
finally:
lock.release()
print(name + " - Lock released")
def main():
t1 = threading.Thread(target=test, args=["#1_Thread"])
t2 = threading.Thread(target=test, args=["#2_Thread"])
t1.start()
time.sleep(3)
t2.start()
main()
您创建的锁定对象是您的函数的本地对象,因此不共享:
lock = threading.Lock()
将您的锁定义为全局锁,它将被共享
import threading, time
lock = threading.Lock()
def test(name):
global lock
print(name + " - Starting thread")
print(name + " - Waiting to acquire lock")
lock.acquire(True)
try:
print(name + " - Lock acquired!")
for i in range(10):
print(name + " - " + str(i))
print("")
time.sleep(1)
finally:
lock.release()
print(name + " - Lock released")
def main():
t1 = threading.Thread(target=test, args=["#1_Thread"])
t2 = threading.Thread(target=test, args=["#2_Thread"])
t1.start()
time.sleep(3)
t2.start()
main()
您的线程各自创建并锁定自己的独立锁:
def test(name):
lock = threading.Lock()
...
那不会提供互斥。两个线程可以同时加不同的锁,不会冲突;只有当两个线程试图锁定 相同的 锁时,锁才会做任何事情。
创建一个锁并将其提供给两个线程。当您使用它时,with
语句通常是一种比 finally
块更干净的方式来确保清理。 That'll lock the lock when execution enters the with
and unlock it when execution leaves:
import threading, time
def test(name, lock):
print(name + " - Starting thread")
print(name + " - Waiting to acquire lock")
with lock:
print(name + " - Lock acquired!")
for i in range(10):
print(name + " - " + str(i))
print("")
time.sleep(1)
print(name + " - Lock released")
def main():
lock = threading.Lock()
t1 = threading.Thread(target=test, args=["#1_Thread", lock])
t2 = threading.Thread(target=test, args=["#2_Thread", lock])
t1.start()
time.sleep(3)
t2.start()
main()