Ich schreibe ein Server-Programm mit einem Hersteller und mehreren Consumern, was mich verwirrt ist nur der erste Task-Produzent in die Warteschlange gestellt bekommt verbraucht, nach denen Aufgaben eingereiht nicht mehr konsumiert werden, Sie bleiben für immer in der Warteschlange.Producer/Consumer Problem mit Python Multiprocessing
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()
Der Hersteller ist ein HTTP-Server, der eine Aufgabe in der Warteschlange einmal eine Anforderung von dem Benutzer erhalten setzen. Es scheint, dass Consumer-Prozesse sind immer noch blockiert , wenn neue Aufgaben in der Warteschlange sind, was seltsam ist.
P.S. Noch zwei Fragen, die nicht in Bezug auf die oben genannten, ich bin nicht sicher, ob ist es besser, HTTP-Server in einen eigenen Prozess als die Haupt Prozess, wenn ja wie kann ich den Hauptprozess laufen lassen, bevor alle Kinder Prozesse enden. Zweite Frage, was ist der beste Weg, um den HTTP-Server anmutig zu stoppen?
bearbeiten: Erzeugercode hinzufügen, es ist nur eine einfache Python wsgi Server:
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()
Ehrfürchtig Während Wenn Sie einen Hersteller + Multi-Arbeiter Beispiel bieten könnte. Es wäre nett. –