producteur/consommateur problème avec python multitraitement

Je suis en train d'écrire un programme serveur avec une producteurs et plusieurs consommateurs,
ce qui me confond est que la première tâche producteur a mis dans la file d'attente devient
consommé, après les tâches en file d'attente ne reçoivent plus consommés, ils restent
dans la file d'attente pour toujours.

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()

Le producteur est un serveur HTTP qui a mis une tâche dans la file d'attente une fois que recevoir
une demande de l'utilisateur. Il semble que les consommateurs processus sont encore
bloqué quand il y a de nouvelles tâches dans la file d'attente, ce qui est étrange.

P. S. un Autre deux questions ne se rapportant pas à la ci-dessus, je ne suis pas sûr si
c'est mieux de mettre du serveur HTTP dans son propre processus autres que la principale
processus, si oui comment puis-je rendre le processus principal de continuer à courir avant tous
les enfants des processus de fin. Deuxième question, quel est le meilleur moyen d'arrêter la
Serveur HTTP gracieusement?

Modifier: ajouter le code du fabricant, c'est juste une simple python serveur wsgi:

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()
InformationsquelleAutor btw0 | 2009-05-27