我有一个应用程序,在给定的intervall循环遍历一个项目列表(然后这个列表的长度变化)对于每个项目它做了一个相当简单的操作,它不只是添加一个值,但它也不是一些非常复杂的计算
我想知道的是我应该锁定这样的每个项目(当前解决方案):
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.
我想这实际上很难回答,因为我认为很大程度上取决于“做一些事情”是什么以及需要多长时间。老实说,我不知道这需要多少时间。特别是与python获取锁定需要多长时间相比。
如果我能以某种方式改善我的问题,请在评论中告诉我。
答案 0 :(得分:1)
您通常希望尽可能缩短锁的时间片。所以你会在变量访问之前立即锁定,然后立即将其删除。你不想阻止一个完整的循环,因为它破坏了并发的主要原因。
对于列表:你是否研究了不同的Queue-classes,特别是用于线程执行?
jpm的评论就在现场。如果你的其他线程也做了一些东西,你也希望它们受到保护。甚至可能存在线索匮乏的问题。
答案 1 :(得分:0)
我建议锁定整个列表(选项2)。如果您只锁定每个项目,则可以在操作的中途修改列表,这可能会有问题,具体取决于您正在做什么。每次锁定和解锁都会产生开销。
答案 2 :(得分:0)
如果锁只是为了保护列表(而不是项目本身),你也可以
def method_1:
lock()
list = the_list[:]
unlock()
for item in list:
do_operation(item);