我正在編寫一個守護程序,該守護程序會產生其他幾個子進程。在運行stop
腳本後,主進程在意圖退出時繼續運行,這讓我很困惑。退出守護進程的問題
import daemon, signal
from multiprocessing import Process, cpu_count, JoinableQueue
from http import httpserv
from worker import work
class Manager:
"""
This manager starts the http server processes and worker
processes, creates the input/output queues that keep the processes
work together nicely.
"""
def __init__(self):
self.NUMBER_OF_PROCESSES = cpu_count()
def start(self):
self.i_queue = JoinableQueue()
self.o_queue = JoinableQueue()
# Create worker processes
self.workers = [Process(target=work,
args=(self.i_queue, self.o_queue))
for i in range(self.NUMBER_OF_PROCESSES)]
for w in self.workers:
w.daemon = True
w.start()
# Create the http server process
self.http = Process(target=httpserv, args=(self.i_queue, self.o_queue))
self.http.daemon = True
self.http.start()
# Keep the current process from returning
self.running = True
while self.running:
time.sleep(1)
def stop(self):
print "quiting ..."
# Stop accepting new requests from users
os.kill(self.http.pid, signal.SIGINT)
# Waiting for all requests in output queue to be delivered
self.o_queue.join()
# Put sentinel None to input queue to signal worker processes
# to terminate
self.i_queue.put(None)
for w in self.workers:
w.join()
self.i_queue.join()
# Let main process return
self.running = False
import daemon
manager = Manager()
context = daemon.DaemonContext()
context.signal_map = {
signal.SIGHUP: lambda signum, frame: manager.stop(),
}
context.open()
manager.start()
的stop
腳本只是一個一行os.kill(pid, signal.SIGHUP)
,但在那之後的子進程(工作進程和HTTP服務器進程)結束好聽,但主要過程就停在那兒,我不知道是什麼讓它從返回。
你看到「退出...」打印出來了嗎? – grieve 2009-06-23 18:55:12
我按原樣試了你的代碼,減去守護進程模塊,它適用於我。你可以給你的守護進程模塊的一個鏈接?谷歌搜索揭示了一些選擇。 – grieve 2009-06-23 19:41:12
對不起,我遲到的迴應,對於守護程序模塊,我使用http://pypi.python.org/pypi/python-daemon/ – btw0 2009-06-26 08:39:30