title: Python how to stop threading operations
body: <p>I want to know how can I stop my program in console with CTRL+C or smth similar.
  The problem is that there are two threads in my program. Thread one crawls the web and extracts some data and thread two displays this data in a readable format for the user. Both parts share same database. I run them like this :</p>
  
  <pre><code>from threading import Thread
  import ResultsPresenter
  
  def runSpider():
      Thread(target=initSpider).start()
      Thread(target=ResultsPresenter.runPresenter).start()
  
  
  if __name__ == "__main__":
      runSpider()
  </code></pre>
  
  <p>how can I do that?</p>
  
  <p>Ok so I created my own thread class :</p>
  
  <pre><code>import threading
  
  class MyThread(threading.Thread):
  """Thread class with a stop() method. The thread itself has to check
  regularly for the stopped() condition."""
  
  def __init__(self):
      super(MyThread, self).__init__()
      self._stop = threading.Event()
  
  def stop(self):
      self._stop.set()
  
  def stopped(self):
      return self._stop.isSet()
  </code></pre>
  
  <p>OK so I will post here snippets of resultPresenter and crawler.
  Here is the code of resultPresenter :</p>
  
  <pre><code># configuration
  DEBUG = False
  DATABASE = database.__path__[0] + '/database.db'
  
  app = Flask(__name__)
  app.config.from_object(__name__)
  app.config.from_envvar('CRAWLER_SETTINGS', silent=True)
  
  def runPresenter():    
      url = "http://127.0.0.1:5000"
      webbrowser.open_new(url)
      app.run()  
  </code></pre>
  
  <p>There are also two more methods here that I omitted - one of them connects to the database and the second method loads html template to display result. I repeat this until conditions are met or user stops the program ( what I am trying to implement ). There are also two other methods too - one get's initial link from the command line and the second valitated arguments - if arguments are invalid I won't run crawl() method. </p>
  
  <p>Here is short version of crawler :</p>
  
  <pre><code>def crawl(initialLink, maxDepth):
  #here I am setting initial values, lists etc
  
  while not(depth &gt;= maxDepth or len(pagesToCrawl) &lt;= 0):
  
    #this is the main loop that stops when certain depth is 
    #reached or there is nothing to crawl
    #Here I am popping urls from url queue, parse them and 
    #insert interesting data into the database
  
  
  parser.close()
  sock.close()              
  dataManager.closeConnection()
  </code></pre>
  
  <p>Here is the <strong>init</strong> file which starts those modules in threads:</p>
  
  <pre><code>import ResultsPresenter, MyThread, time, threading
  
  def runSpider():
  
      MyThread.MyThread(target=initSpider).start()
      MyThread.MyThread(target=ResultsPresenter.runPresenter).start()
  
  
  def initSpider(): 
  
      import Crawler
          import database.__init__
      import schemas.__init__
      import static.__init__
      import templates.__init__
  
      link, maxDepth = Crawler.getInitialLink()
      if link:
          Crawler.crawl(link, maxDepth)
  
  
  
  killall = False
  
  if __name__ == "__main__":    
  
  global killall
  runSpider()
  
  while True:
  
      try:
          time.sleep(1)
  
      except:            
  
          for thread in threading.enumerate():
              thread.stop()
  
          killall = True
          raise
  </code></pre>