title: producer/consumer problem with python multiprocessing
body: <p>I am writing a server program with one producer and multiple consumers,
  what confuses me is only the first task producer put into the queue gets
  consumed, after which tasks enqueued no longer get consumed, they remain
  in the queue forever.</p>
  
  <pre><code>from multiprocessing import Process, Queue, cpu_count
  from http import httpserv
  import time
  
  def work(queue):
      while True:
          task = queue.get()
          if task is None:
              break
          time.sleep(5)
          print "task done:", task
      queue.put(None)
  
  class Manager:
      def __init__(self):
          self.queue = Queue()
          self.NUMBER_OF_PROCESSES = cpu_count()
  
      def start(self):
          self.workers = [Process(target=work, args=(self.queue,))
                          for i in xrange(self.NUMBER_OF_PROCESSES)]
          for w in self.workers:
              w.start()
  
          httpserv(self.queue)
  
      def stop(self):
          self.queue.put(None)
          for i in range(self.NUMBER_OF_PROCESSES):
              self.workers[i].join()
          queue.close()
  
  Manager().start()
  </code></pre>
  
  <p>The producer is a HTTP server which put a task in the queue once receive
  a request from the user. It seems that consumer processes are still
  blocked when there are new tasks in the queue, which is weird.</p>
  
  <p>P.S. Another two questions not relating to the above, I am not sure if
  it's better to put HTTP server in its own process other than the main
  process, if yes how can I make the main process keep running before all
  children processes end. Second question, what's the best way to stop the
  HTTP server gracefully?</p>
  
  <p><strong>Edit</strong>: add producer code, it's just a simple python wsgi server:</p>
  
  <pre><code>import fapws._evwsgi as evwsgi
  from fapws import base
  
  def httpserv(queue):
      evwsgi.start("0.0.0.0", 8080)
      evwsgi.set_base_module(base)
  
      def request_1(environ, start_response):
          start_response('200 OK', [('Content-Type','text/html')])
          queue.put('task_1')
          return ["request 1!"]
  
      def request_2(environ, start_response):
          start_response('200 OK', [('Content-Type','text/html')])
          queue.put('task_2')
          return ["request 2!!"]
  
      evwsgi.wsgi_cb(("/request_1", request_1))
      evwsgi.wsgi_cb(("/request_2", request_2))
  
      evwsgi.run()
  </code></pre>