class Client(tornado.websocket.WebSocketHandler):
def open(self):
print "Connection is opened"
def on_message(self, message):
self.Process(message)
def on_close(self):
print "socket closed"
Nehmen Sie den obigen Code in Python/Tornado. Eine Instanz von Client
wird erstellt, wenn ein neuer Websocket-Client eine Verbindung zum Server herstellt. Das Problem ist, self.process(message)
dauert Minuten und der gesamte Handler ist blockiert (keine Verbindung mehr akzeptieren oder Nachricht zu empfangen), solange self.process(message)
auf Prozess ist. Gibt es eine Lösung, um dieses Hindernis zu überwinden?Tornado nicht blockierende Websocket Server-Implementierung
Sie können versuchen, "self.process" -Methode in einem separaten Thread ausführen. Wenn es sich um eine CPU-intensive Aufgabe handelt, gibt es keine Alternative, sie in einem separaten Thread auszuführen. Wenn es sich um eine netzwerkgebundene Aufgabe handelt, können Sie versuchen, eine asynchrone Bibliothek für diese Aufgabe zu finden oder Ihre eigene zu schreiben. – xyres
Bearbeiten [einige Sprache war im letzten Kommentar verwirrend]: Sie können die Anzahl der Threads durch die ['max_workers'] (https://docs.python.org/3.5/library/concurrent.futures.html#concurrent) begrenzen. futures.ThreadPoolExecutor) Argument. Zu einer bestimmten Zeit wird also nur eine begrenzte Anzahl von Anfragen bearbeitet und der Rest wird in die Warteschlange gestellt. – xyres
Ich habe gerade 'ThreadPoolExecutor' gefunden. Ich denke, das ist eine gute Bibliothek dafür. –