1

我正在尝试这个:

import multiprocessing
from wsgiref.simple_server import make_server
import webbrowser
import time

def application(environ, start_response):   
    start_response("200 OK", [("Content-Type", "text/plain")])
    return ["Hello!"]


class Server(multiprocessing.Process):
    def run(self):
        print "HTTP Server starts."
        server = make_server(host = "127.0.0.1", 
                             port = 88, 
                             app = application)
        try:
            server.serve_forever()
        except (KeyboardInterrupt, SystemExit):
            print "HTTP Server stopped."
        raise

httpd = Server()
httpd.start()
#webbrowser.open("http://127.0.0.1:88")
time.sleep(3)
httpd.terminate()
httpd.join()
print "End"

如果我取消注释 webbrowser 行,浏览器将不会停止打开新窗口。为什么?

我仍然不太了解多处理模块,但是这样的事情应该很简单。这是怎么做到的?

编辑:

http://docs.python.org/2/library/multiprocessing.html的第一个注释“要求子模块可以导入主模块”,因此:

    if __name__=='__main__':            
        httpd = Server()
        httpd.start()
        webbrowser.open("http://127.0.0.1:88")
        time.sleep(3)
        httpd.terminate()
        httpd.join()
        print "End"

似乎工作正常。

但我想知道如何向服务器发送 SystemExit 信号。更好的方法?

4

1 回答 1

3

Windows 不能分叉现有进程来创建子进程,就像在 Unices 上一样。在 Windows 上还有一些额外的事情需要考虑:http: //docs.python.org/2/library/multiprocessing#windows

因此,在 Windows 中创建了一个新进程并导入了代码。任何无条件运行的代码都将在子进程中执行。在您的情况下,创建一个新的服务器进程和一个浏览器窗口。这将导入您的主模块...

正如您发现的那样,解决方案是使用if __name__ == '__main__':成语。

于 2013-05-31T22:02:02.313 回答