我正在編寫一個生產者和多個消費者的服務器程序, 什麼使我困惑的只是生產者放入隊列的第一個任務獲取 消耗,之後排隊的任務不再消耗,他們永遠在隊列中保持 。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.另外兩個問題與上述不相關,我不確定是否 最好把HTTP服務器放在除主進程外的其他進程中,如果是的話,我怎麼能讓主進程在所有子進程結束之前保持運行。第二個問題,優雅地阻止 HTTP服務器的最佳方式是什麼?
編輯:添加生產者代碼,它只是一個簡單的Python 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()
真棒而如果你能提供一個製片人+多工人的例子。這將是很好的。 – 2017-06-15 08:17:04