Errno 9 Multiprozessor-Modul mit Tornado in Python
-
28-09-2019 - |
Frage
Für Operationen in meinem Tornado-Server, der auf Block zu erwarten sind (und nicht leicht modifiziert werden kann Dinge wie Tornados asynchroner HTTP-Request-Client zu verwenden), habe ich ausgelagert, die Arbeit zu getrennten Arbeitsprozessen mit dem multiprocessing
Modul. Insbesondere war ich ein Multiprozessing Pool
verwenden, da es eine Methode namens apply_async
bietet, die sehr gut mit Tornado arbeitet, da es einen Rückruf als eines ihrer Argumente annimmt.
Ich erkannte vor kurzem, dass ein Pool zuweist die Anzahl der Prozesse, so dass, wenn sie alle blockiert werden, Operationen, die ein neues Verfahren erfordern wird warten müssen. Ich erkennen, dass der Server immer noch Verbindungen seit apply_async
Arbeiten nehmen können Dinge zu einer Task-Warteschlange hinzufügen und ist eher sofort beendet, selbst, aber ich bin auf der Suche nach Laich n Prozesse für n Menge blockieren Aufgaben muss ich durchführen.
Ich dachte, dass ich die
Lösung add_handler nimmt eine gültige Dateideskriptor, kein PID. Als ein Beispiel von dem, was erwartet wird, Tornado selbst add_handler verwendet normalerweise durch in einem Sockel Objekts fileno Passing (), die den Dateideskriptor des Objekts zurückgibt. PID ist in diesem Fall irrelevant. add_handler
Methode für meinen Tornado-Server IOLoop verwenden könnte einen Handler für jede neue PID hinzufügen, dass ich zu, dass IOLoop erstellen. Ich habe getan, etwas ähnliches vor, aber es wurde mit popen und einem beliebigen Befehl. Ein Beispiel einer solchen Anwendung dieses Verfahrens ist
Andere Tipps
Dieses Projekt Check out:
https://github.com/vukasin/tornado-subprocess
ermöglicht es Ihnen, beliebige Prozesse von Tornado zu starten und einen Rückruf erhalten, wenn sie (mit Zugang zu ihrem Status, stdout und stderr) beenden.