Also, ich habe eine Anwendung, die Twisted + Stomper als STOMP-Client verwendet, die Arbeit in einem Multiprozessing.Pool von Arbeitern farmt.Twisted-Network-Client mit Multiprocessing-Mitarbeitern?
Dies scheint ok zu arbeiten, wenn ich dies nur ein Python-Skript verwenden, um Feuer, die (vereinfacht) sieht wie folgt aus etwas:
# stompclient.py
logging.config.fileConfig(config_path)
logger = logging.getLogger(__name__)
# Add observer to make Twisted log via python
twisted.python.log.PythonLoggingObserver().start()
# initialize the process pool. (child processes get forked off immediately)
pool = multiprocessing.Pool(processes=processes)
StompClientFactory.username = username
StompClientFactory.password = password
StompClientFactory.destination = destination
reactor.connectTCP(host, port, StompClientFactory())
reactor.run()
Da dies für die Bereitstellung verpackt wird, ich dachte, dass ich den Vorteil nehmen würde des Twisted-Skripts und führen Sie dies aus einer Tac-Datei.
meine hier mit sehr ähnlich aussehenden tac-Datei:
# stompclient.tac
logging.config.fileConfig(config_path)
logger = logging.getLogger(__name__)
# Add observer to make Twisted log via python
twisted.python.log.PythonLoggingObserver().start()
# initialize the process pool. (child processes get forked off immediately)
pool = multiprocessing.Pool(processes=processes)
StompClientFactory.username = username
StompClientFactory.password = password
StompClientFactory.destination = destination
application = service.Application('myapp')
service = internet.TCPClient(host, port, StompClientFactory())
service.setServiceParent(application)
Aus Gründen der Illustration, ich habe ein paar Details zusammengebrochen oder geändert; Hoffentlich waren sie nicht die Essenz des Problems. Zum Beispiel hat meine App ein Plugin-System, der Pool wird durch eine separate Methode initialisiert, und dann wird die Arbeit an den Pool delegiert, indem pool.apply_async() verwendet wird, indem ich eine der process() Methoden meines Plugins übergebe.
Also, wenn ich das Skript (stompclient.py) ausführen, funktioniert alles wie erwartet.
Es scheint auch OK zu arbeiten, wenn ich Twist in Nicht-Daemon-Modus (-n) ausgeführt:
twistd -noy stompclient.tac
jedoch tut es nicht Arbeit, wenn ich im Daemon-Modus ausgeführt:
twistd -oy stompclient.tac
Die Anwendung scheint zu starten OK, aber wenn es versucht, die Arbeit abzuzweigen, hängt es einfach. Mit "hängen" meine ich, dass es scheint, dass der Child-Prozess nie aufgefordert wird, etwas zu tun, und dass das Elternelement (das "pool.apply_async()" genannt wird) nur darauf wartet, dass die Antwort zurückkommt.
Ich bin mir sicher, dass ich mit Twisted + Multiprocessing etwas Dummes mache, aber ich hoffe wirklich, dass mir jemand den Fehler in meinem Ansatz erklären kann.
Vielen Dank im Voraus!
Das war * extrem * hilfreich. Vielen Dank! –