プロデューサと複数のコンシューマが1人のサーバープログラムを作成しています 私に混乱させるものは、キューに入れた最初のタスクプロデューサだけです が消費され、それらは永久にキューに のままです。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()
プロデューサーが一度 ユーザからの要求を受信キューにタスクを置くHTTPサーバです。待ち行列に新しいタスクがあると消費者プロセスがまだブロックされていると思われますが、これは奇妙です。
P.S.上記に関係しない別の2つの質問は、私は メインの プロセス以外の独自のプロセスにHTTPサーバーを配置する方が良いかどうかわかりません。はい、すべての前にメインプロセスを実行し続けるにはどうすればいいですか? 子プロセスが終了します。 2番目の質問は、 HTTPサーバーを正常に停止する最良の方法は何ですか?
編集:私は、これは完璧に動作として、Webサーバの一部に異常がなければならないと思います
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()
恐ろしいあなたがプロデューサー+マルチワーカー例を提供することができればしながら。それはいいだろう。 –