2012-08-07 73 views
2

我在我的python程序中有一个列表在某些场合获取新项目(它是一个消息队列使用者)。然后,我有一个线程,每隔几分钟检查一次,看看列表中是否有任何内容,如果有,那么我想对每个项目执行一个操作,然后清空列表。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

我应该使用锁来确保子线程中的操作是原子操作,并确保主线程无法在列表中通过列表时更改列表吗?

是的。如果你正确实施它是的。

或者我应该改为使用某种标志?

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

重要提示:它看起来像我试图从stdlib重新实现queue模块,你可能想看看它。

除了有一堆有趣的功能也被线程安全的:

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

+1

撇开。如果你想要一个“队列”,但你不需要线程安全,你可能真的想要['collections.deque'](http://docs.python.org/library/collections.html#collections.deque)而不是'queue.Queue';主要区别在于后者用锁定来包装前者 – SingleNegationElimination 2012-08-07 12:03:35

相关问题