2

我的 python 程序中有一个列表,可以在某些情况下获取新项目(它是消息队列消费者)。然后我有一个线程,每隔几分钟检查一次列表中是否有任何内容,如果有,那么我想对每个项目执行操作,然后清空列表。

现在我的问题:我应该使用锁来确保子线程中的操作是原子的,这是否确保主线程在我浏览列表时不能更改列表?
还是我应该改用某种标志?

伪代码使我的问题更清楚。

子线程:

def run(self):
    while 1:
        if get_main_thread_list() is not empty:
            do_operations()
        empty_the_list()
        sleep(30)

主线程:

list = []

def on_event(item):
    list.add(item)

def main():
    start_thread()
    start_listening_to_events()

我希望这能让我的问题更清楚,显然欢迎任何指向资源或评论的链接!

PS:我很清楚,对于这个问题,我可能无法很好地掌握线程编程,如果您相信的话,如果您有时间,请花一些时间解释我的推理有什么问题。

4

1 回答 1

4

我应该使用锁来确保子线程中的操作是原子的,这是否确保主线程在我浏览列表时不能更改列表?

是的。如果你正确地实现它是的。

还是我应该改用某种标志?

“某种标志” == 锁,所以你最好使用线程锁。

重要提示:在我看来,您正在尝试queue从 stdlib 重新实现模块,您可能想看看它。

除了拥有一堆有趣的特性之外,它也是线程安全的:

queue模块实现了多生产者、多消费者队列。当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用。该Queue模块中的类实现了所有必需的锁定语义。

于 2012-08-07T10:08:51.380 回答