【问题标题】:Python CGI simultaneous AJAX requestsPython CGI 并发 AJAX 请求
【发布时间】:2015-12-19 04:07:31
【问题描述】:

这就是交易:我正在编写一个简单的轻量级 IRC 应用程序,在本地托管,它与 Xchat 的工作基本相同,并且可以在您的浏览器中运行,就像 Sabnzbd 一样。我在浏览器中将搜索结果显示为 html 表格,并使用带有 on_click 事件的 AJAX GET 请求,启动下载。我在 1 秒循环中使用另一个 AJAX GET 请求来请求下载信息(状态、进度、速度、ETA 等)。我遇到了并发 AJAX 请求的问题,因为我的 CGI 处理程序似乎一次只能处理一个线程:确实,主线程处理下载,同时也发送下载状态请求。 因为我在某个地方有一个 Django 应用程序,所以我尝试实现这个 IRC 应用程序并且一切正常。同时请求得到妥善处理。 那么对于 HTTP 处理程序有什么我必须知道的吗?用基本的 CGI 句柄来处理并发请求是不可能的吗? 我将以下内容用于我的 CGI IRC 应用程序:

from http.server import BaseHTTPRequestHandler, HTTPServer, CGIHTTPRequestHandler

如果不是关于理论而是关于我的代码,如果有帮助,我很乐意发布各种 python 脚本。

【问题讨论】:

    标签: python ajax multithreading cgi simultaneous


    【解决方案1】:

    再深入一点the documentation:

    这四个类同步处理请求;必须先完成每个请求,然后才能开始下一个请求。

    TL;DR:使用真实的 Web 服务器。

    【讨论】:

    • 所以这是我的假设?它适用于我的 Django 应用程序,因为它基于 WSGI?
    • 它适用于您的 Django 应用程序,因为它是通过可以同时处理多个请求的 Web 服务器运行的。
    【解决方案2】:

    所以,经过进一步研究,这是我的代码,可以正常工作:

    from http.server import BaseHTTPRequestHandler, HTTPServer, CGIHTTPRequestHandler
    from socketserver import ThreadingMixIn
    import threading
    import cgitb; cgitb.enable()  ## This line enables CGI error reporting
    import webbrowser
    
    
    class HTTPRequestHandler(CGIHTTPRequestHandler):
        """Handle requests in a separate thread."""
        def do_GET(self):
            if "shutdown" in self.path:
                self.send_head()
                print ("shutdown")
                server.stop()
            else:
                self.send_head()
    
    
    class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
        allow_reuse_address = True
        daemon_threads = True
    
        def shutdown(self):
            self.socket.close()
            HTTPServer.shutdown(self)
    
    class SimpleHttpServer():
        def __init__(self, ip, port):
            self.server = ThreadedHTTPServer((ip,port), HTTPRequestHandler)
            self.status = 1
    
        def start(self):
            self.server_thread = threading.Thread(target=self.server.serve_forever)
            self.server_thread.daemon = True
            self.server_thread.start()
    
        def waitForThread(self):
            self.server_thread.join()
    
        def stop(self):
            self.server.shutdown()
            self.waitForThread()
    
    if __name__=='__main__':
        HTTPRequestHandler.cgi_directories = ["/", "/ircapp"]
        server = SimpleHttpServer('localhost', 8020)
        print ('HTTP Server Running...........')
        webbrowser.open_new_tab('http://localhost:8020/ircapp/search.py') 
        server.start()
        server.waitForThread()
    

    【讨论】:

      猜你喜欢
      • 2019-07-27
      • 2017-08-23
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      • 2012-05-30
      相关资源
      最近更新 更多