2015-09-22 18 views
0

Итак, вот сделка: Я пишу простой легкий IRC-приложение, размещенное локально, которое в основном выполняет ту же работу, что и Xchat, и работает в вашем браузере, как и Sabnzbd. Я показываю результаты поиска в браузере в виде таблицы html и с помощью запроса AJAX GET с событием on_click запускается загрузка. Я использую другой запрос AJAX GET в течение 1 секунды для запроса информации о загрузке (статус, ход, скорость, ETA и т. Д.). Я ударяю удар с одновременными запросами AJAX, так как мой обработчик CGI, кажется, способен обрабатывать только один поток за раз: действительно, основной поток обрабатывает загрузку, в то время как запросы на загрузку отправляются тоже. Поскольку у меня было приложение Django, я попытался реализовать это приложение IRC, и все работает нормально. Одновременные запросы обрабатываются должным образом. Так что же мне нужно знать с обработчиком HTTP? Разве не возможно, чтобы основная рукоятка CGI имела дело с одновременными запросами? Я использую следующий для моего CGI IRC приложения:Python CGI одновременные запросы AJAX

from http.server import BaseHTTPRequestHandler, HTTPServer, CGIHTTPRequestHandler 

Если речь идет не о теории, а о моем коде, я могу с удовольствием поста различных сценариями питона, если это помогает.

ответ

0

Таким образом, после проведения дальнейших исследований, вот мой код, Уик работы:

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: Используйте настоящий веб-сервер.

+0

Так это то, что я предполагал? Он работает на моем приложении Django, потому что он основан на WSGI? – mrj

+1

Он работает на вашем приложении Django, потому что он запускается через веб-сервер, который может обрабатывать несколько одновременных запросов. –

Смежные вопросы