2015-09-22 109 views
0

所以,這裏的交易:我正在寫一個簡單的輕量級IRC應用程序,本地託管,基本上和Xchat一樣工作,並在您的瀏覽器中工作,就像Sabnzbd一樣。我在瀏覽器中將搜索結果顯示爲html表格,並使用帶有on_click事件的AJAX GET請求啓動下載。我在1秒循環中使用另一個AJAX GET請求來請求下載信息(狀態,進度,速度,ETA等)。由於我的CGI處理程序似乎只能夠一次處理一個線程,所以我碰到了AJAX請求同時出現的問題:實際上,主線程處理下載,同時發送下載狀態請求。 因爲我有一個Django應用程序,我試着實現這個IRC應用程序,一切工作正常。同時處理的請求得到妥善處理。 那麼有什麼我必須知道的HTTP處理程序?基本的CGI句柄無法處理同時發生的請求嗎? 我用我的CGI應用程序IRC如下:Python CGI同時AJAX請求

from http.server import BaseHTTPRequestHandler, HTTPServer, CGIHTTPRequestHandler 

如果它不是理論,而是關於我的代碼,我可以,如果有幫助樂意交各種Python腳本。

回答

0

所以,經過進一步的研究,這是我的代碼,whick作品:

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() 
0

一點點深入the documentation

這四類進程請求同步;每個請求必須完成才能開始下一個請求。

TL; DR:使用真正的Web服務器。

+0

所以這是我的假設?它適用於我的Django應用程序,因爲它基於WSGI? – mrj

+1

它適用於您的Django應用程序,因爲它通過可處理多個同時請求的Web服務器運行。 –