2016-07-27 49 views
4

如果列表为空,是否有办法使线程进入睡眠状态,并在有项目时再次将其唤醒?我不想使用队列,因为我想能够索引到数据结构中。如果列表为空,Python块线程

+0

@AkshatMahajan我的错误。我的意思是“名单”。 – mrQWERTY

+0

但是,如果我理解正确的话,那么你需要制作一个循环,要求列表的状态。或者在设置列表时触发线程 –

+1

我正在使用条件锁。如果有效,我会在这里发布我的解决方案。 – mrQWERTY

回答

2

是,该解决方案可能会涉及threading.Condition变量,你在评论中指出。

没有更多信息或代码片段,很难知道哪些API适合您的需求。你如何生产新的元素?你如何消耗它们?在基地,你可以做这样的事情:

cv = threading.Condition() 
elements = [] # elements is protected by, and signaled by, cv 

def produce(...): 
    with cv: 
    ... add elements somehow ... 
    cv.notify_all() 

def consume(...): 
    with cv: 
    while len(elements) == 0: 
     cv.wait() 
    ... remove elements somehow ... 
1

我会去与这样的:

import threading 

class MyList (list): 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self._cond = threading.Condition() 

    def append(self, item): 
     with self._cond: 
      super().append(item) 
      self._cond.notify_all() 

    def pop_or_sleep(self): 
     with self._cond: 
      while not len(self): 
       self._cond.wait() 
      return self.pop()