如何退出在其自身线程上启动的wsgiserver?

2024-04-20 09:01:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在进行一个项目,希望能够:

  • 在自己的线程上启动wsgiserver
  • 做一些事情(其中一些涉及到与wsgiserver交互)
  • 关闭线程
  • 结束程序

我可以做前两步,但后两步我遇到麻烦了。我提供了一个更简单的项目版本,展示了我所面临的问题,我可以从上面开始做前两个步骤,而不是最后两个步骤。在

几个问题:

  • 如何让线程停止wsgi服务器?在
  • 我是否只需要拉出wsgiserver代码并在它自己的进程中启动它?在

我的项目的一些细节可能会引出一些问题:

  • 我的项目目前正在启动其他进程,这些进程旨在与我的wsgi服务器对话。我可以启动所有程序并让我的进程与服务器对话,但我无法正常关闭。此代码示例旨在提供一个“相对简单”的示例,它可以更容易地查看。在
  • 在代码中有尝试解决这个问题失败的残余,希望它们不会太分散注意力。在

    #Simple echo program
    #listens on port 3000 and returns anything posted by http to that port
    
    #installing required libraries
    #download/install Microsoft Visual C++ 9.0 for Python
    #https://www.microsoft.com/en-us/download/details.aspx?id=44266
    #pip install greenlet
    #pip install gevent
    
    import sys
    import threading
    import urllib
    import urllib2
    import time
    import traceback
    from gevent.pywsgi import WSGIServer, WSGIHandler
    from gevent import socket
    
    server = ""
    
    def request_error(start_response):
        global server
        # Send error to atm - must provide start_response
        start_response('500', [])
        #server.stop()
        return ['']
    
    def handle_transaction(env, start_response):
        global server
        try:
            result = env['wsgi.input'].read()
            print("Received: " + result)
            sys.stdout.flush()
            start_response('200 OK', [])
            if (result.lower()=="exit"):
                #server.stop()
                return result
            else:
                return result
        except:
            return request_error(start_response)
    
    class ErrorCapturingWSGIHandler(WSGIHandler):
        def read_requestline(self):
            result = None
            try:
                result = WSGIHandler.read_requestline(self)
            except:
                protocol_error()
                raise # re-raise error, to not change WSGIHandler functionality
            return result
    
    class ErrorCapturingWSGIServer(WSGIServer):
        handler_class = ErrorCapturingWSGIHandler
    
    def start_server():
        global server
        server = ErrorCapturingWSGIServer(
        ('', 3000), handle_transaction, log=None)
    
        server.serve_forever()
    
    def main():
        global server
    
        #start server on it's own thread
        print("Echoing...")
        commandServerThread = threading.Thread(target=start_server)
        commandServerThread.start()
    
        #now that the server is started, send data
        req = urllib2.Request("http://127.0.0.1:3000", data='ping')
        response = urllib2.urlopen(req)
        reply = response.read()
        print(reply)
    
        #take a look at the threading info
        print(threading.active_count())
    
        #try to exit
        req = urllib2.Request("http://127.0.0.1:3000", data='exit')
        response = urllib2.urlopen(req)
        reply = response.read()
        print(reply)
    
        #Now that I'm done, exit
        #sys.exit(0)
        return    
    
    if __name__ == '__main__':
        main()
    

Tags: to项目importreadreturnserver进程response