我有一个应用程序,它以给定的时间间隔循环遍历项目列表(然后此列表的长度会有所不同),对于每个项目,它执行一个相当简单的操作,它不仅仅是添加一个值,也不是一些真正复杂的计算。
我想知道的是我是否应该像这样锁定每个项目(当前解决方案):
def method_1:
for item in the_list:
do_operation(item);
def do_operation(item):
lock()
//do some stuff.
unlock()
或者我应该这样做:
def method_1:
lock()
for item in the_list:
do_operation(item);
unlock()
def do_operation(item):
//do some stuff.
我想这实际上很难回答,因为我认为这在很大程度上取决于"做一些事情"是什么以及需要多长时间。老实说,我不知道这需要多少时间。特别是与蟒蛇获得锁所需的时间相比。
在评论中让我知道我是否可以以某种方式改进我的问题。
您通常希望使锁的时间片尽可能短。 因此,您通常会在变量访问之前立即锁定,并在再次之后立即将其删除。您不想阻塞完整的循环,因为它会聋毁并发的主要原因。
在列表的情况下:您是否研究过专门用于线程执行的不同队列类?
而摩根大通的评论恰到好处。 如果你的其他线程也做了一些事情,你也希望它们受到保护。甚至可能存在线程不足的问题。
我建议锁定整个列表(选项 2)。如果您只锁定每个项目,则列表可能会在操作过程中修改,这可能会有问题,具体取决于您正在执行的操作。还有与每个锁定和解锁关联的开销。
如果锁只是为了保护列表(而不是项目本身),你也可以这样做
def method_1:
lock()
list = the_list[:]
unlock()
for item in list:
do_operation(item);