锁定多少以及何时锁定

时间:2012-11-12 12:50:12

标签: python concurrency locking

我有一个应用程序,在给定的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获取锁定需要多长时间相比。

如果我能以某种方式改善我的问题,请在评论中告诉我。

3 个答案:

答案 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);