锁定多少以及何时锁定



我有一个应用程序,它以给定的时间间隔循环遍历项目列表(然后此列表的长度会有所不同),对于每个项目,它执行一个相当简单的操作,它不仅仅是添加一个值,也不是一些真正复杂的计算。

想知道的是我是否应该像这样锁定每个项目(当前解决方案):

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

最新更新