Estoy escribiendo un programa de servidor con un productor y múltiples consumidores, lo que me confunde es solo el primer productor de tarea puesto en la cola consumido, después de lo cual las tareas en cola ya no se consumen, permanecen en la cola para siempre.problema productor/consumidor con multiproceso de python
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()
El productor es un servidor HTTP que puso una tarea en la cola recibe una vez una petición del usuario. Parece que los procesos de los consumidores todavía están bloqueados cuando hay nuevas tareas en la cola, lo que es extraño.
P.S. Otras dos preguntas que no están relacionadas con lo anterior, no estoy seguro de si es mejor poner el servidor HTTP en su propio proceso que no sea el proceso , si es así, ¿cómo puedo hacer que el proceso principal siga funcionando antes de que todos los procesos secundarios finalicen? Segunda pregunta, ¿cuál es la mejor manera de detener el servidor HTTP con gracia?
Editar: agregar código del productor, es sólo un simple servidor de pitón 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()
impresionante mientras que si usted podría proporcionar un ejemplo productor + multi-trabajador. Sería bueno. –