title: how to kill zombie processes created by multiprocessing module?
body: <p>I'm very new to <code>multiprocessing</code> module. And I just tried to create the following: I have one process that's job is to get message from RabbitMQ and pass it to internal queue (<code>multiprocessing.Queue</code>). Then what I want to do is : spawn a process when new message comes in. It works, but after the job is finished it leaves a zombie process not terminated by it's parent. Here is my code:</p>
  
  <p>Main Process:</p>
  
  <pre><code> #!/usr/bin/env python
  
   import multiprocessing
   import logging
   import consumer
   import producer
   import worker
   import time
   import base
  
   conf = base.get_settings()
   logger = base.logger(identity='launcher')
  
   request_order_q = multiprocessing.Queue()
   result_order_q = multiprocessing.Queue()
  
   request_status_q = multiprocessing.Queue()
   result_status_q = multiprocessing.Queue()
  
   CONSUMER_KEYS = [{'queue':'product.order',
                     'routing_key':'product.order',
                     'internal_q':request_order_q}]
   #                 {'queue':'product.status',
   #                  'routing_key':'product.status',
   #                  'internal_q':request_status_q}]
  
   def main():
       # Launch consumers
       for key in CONSUMER_KEYS:
           cons = consumer.RabbitConsumer(rabbit_q=key['queue'],
                                          routing_key=key['routing_key'],
                                          internal_q=key['internal_q'])
           cons.start()
  
       # Check reques_order_q if not empty spaw a process and process message
       while True:
           time.sleep(0.5)
           if not request_order_q.empty():
               handler = worker.Worker(request_order_q.get())
               logger.info('Launching Worker')
               handler.start()
  
   if __name__ == "__main__":
       main()
  </code></pre>
  
  <p>And here is my Worker:</p>
  
  <pre><code> import multiprocessing
   import sys 
   import time
   import base
  
   conf = base.get_settings()
   logger = base.logger(identity='worker')
  
   class Worker(multiprocessing.Process):
  
       def __init__(self, msg):
           super(Worker, self).__init__()
           self.msg = msg 
           self.daemon = True
  
       def run(self):
           logger.info('%s' % self.msg)
           time.sleep(10)
           sys.exit(1)
  </code></pre>
  
  <p>So after all the messages gets processed I can see processes with <code>ps aux</code> command. But I would really like them to be terminated once finished.
  Thanks.</p>