2016-07-27 70 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()