0

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

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

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 获取锁所需的时间相比。

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

4

3 回答 3

1

您通常希望尽可能短的锁定时间片。因此,您通常会在变量访问之前立即锁定并在之后立即将其删除。你不想阻塞一个完整的循环,因为它破坏了并发的主要原因。

在列表的情况下:您是否研究过专门用于线程执行的不同队列类?

jpm的评论是当场的。如果你的其他线程也做一些事情,你也希望它们受到保护。甚至可能存在线程饥饿问题。

于 2012-11-12T12:57:22.087 回答
0

我建议锁定整个列表(选项 2)。如果您只锁定每个项目,则可以在操作过程中修改列表,这可能会出现问题,具体取决于您正在做什么。还有与每个锁定和解锁相关的开销。

于 2012-11-12T12:56:46.967 回答
0

如果锁定只是为了保护列表(而不是项目本身),您也可以这样做

def method_1:
    lock()
    list = the_list[:]
    unlock()
    for item in list:
        do_operation(item);
于 2012-11-12T13:05:02.233 回答