想象我有两个线程,每个线程修改一个不同的变量。我可以将相同的锁对象传递给他们,还是应该使用两个单独的锁?一般来说,什么时候应该使用多把锁?
这是一个玩具示例:
from threading import Thread, Lock
from time import sleep
def task(lock, var):
with lock:
var = 1
sleep(5)
lock = Lock()
var1 = []
var2 = []
Thread(target=task, args=(lock, var1)).start()
Thread(target=task, args=(lock, var2)).start()
还是更好
lock1 = Lock()
lock2 = Lock()
var1 = []
var2 = []
Thread(target=task, args=(lock1, var1)).start()
Thread(target=task, args=(lock2, var2)).start()
一次只有一个线程可以持有锁,锁用于提供对一段数据(或变量)的互斥访问。
根据您的示例,每个线程访问单独的变量,您需要两个单独的锁 - 每个变量一个。但请注意,如果只有一个线程访问变量,则不需要为其使用锁。
如果只使用一把锁,则一次只有一个线程能够执行“工作”——即使它们的工作是完全独立的。