title: How to trigger a function once a condition is met
body: <p><strong>What is an efficient way that I can trigger some function once the length of a list changes by a certain amount?</strong></p>
  
  <p>I have a nested list to which I add data 100 times per second, and I want to trigger a function once the length of the list increased by some value. I tried doing this with an <code>if</code> statement inside a <code>while</code> loop (see <code>my_loop()</code> below). This works, but this seemingly simple operation takes up 100% of one of my CPU cores. It seems to me that constantly querying the size of the list is the limiting factor of the script (adding data to the list in the <code>while</code> loop is not resource-intensive).</p>
  
  <p>Here is what I have tried so far:</p>
  
  <pre><code>from threading import Event, Thread
  import time
  
  def add_indefinitely(list_, kill_signal):
      """
      list_ : list
          List to which data is added.
      kill_signal : threading.Event
      """
      while not kill_signal.is_set():
          list_.append([1] * 32)
          time.sleep(0.01)  # Equivalent to 100 Hz.
  
  
  def my_loop(buffer_len, kill_signal):
      """
      buffer_len: int, float
          Size of the data buffer in seconds. Gets converted to n_samples
          by multiplying by the sampling frequency (i.e., 100).
      kill_signal : threading.Event
      """
      buffer_len *= 100
      b0 = len(list_)
      while not kill_signal.is_set():
          if len(list_) - b0 &gt; buffer_len:
              b0 = len(list_)
              print("Len of list_ is {}".format(b0))
  
  
  list_ = []
  kill_signal = Event()
  buffer_len = 2  # Print something every 2 seconds.
  
  
  data_thread = Thread(target=add_indefinitely, args=(list_, kill_signal))
  data_thread.start()
  
  loop_thread = Thread(target=my_loop, args=(buffer_len, kill_signal))
  loop_thread.start()
  
  
  def stop_all():
      """Stop appending to and querying the list.
      SO users, call this function to clean up!
      """
      kill_signal.set()
      data_thread.join()
      loop_thread.join()
  </code></pre>
  
  <p>Example output:</p>
  
  <pre><code>Len of list_ is 202
  Len of list_ is 403
  Len of list_ is 604
  Len of list_ is 805
  Len of list_ is 1006
  </code></pre>