Tak, mam aplikację, która używa Twisted + Stomper jako klienta STOMP, który prowadzi prace do wieloprocesowości. Pracowników.Skręcony klient sieciowy z pracownikami wieloprocesowymi?
To wydaje się działać ok, gdy po prostu użyć skryptu Pythona to odpalić, który (uproszczone) wygląda mniej więcej tak:
# 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()
Jak to zostanie zapakowana do wdrożenia, myślałem, że chciałbym skorzystać skryptu twistd i uruchom go z pliku tac.
Oto mój bardzo podobne-wyglądający plik tac:
# 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)
Dla przykładu, ja zawalił lub zmienił kilka szczegółów; miejmy nadzieję, że nie stanowiły one sedna problemu. Na przykład moja aplikacja ma system wtyczek, pula jest inicjowana przez osobną metodę, a następnie praca jest delegowana do puli za pomocą metody pool.apply_async() przekazującej jedną z metod process() mojej wtyczki.
Po uruchomieniu skryptu (stompclient.py) wszystko działa zgodnie z oczekiwaniami.
Wydaje się również do pracy OK, jeśli biegnę skręt w trybie non-daemon (N):
twistd -noy stompclient.tac
jednak robi nie pracę podczas uruchamiania w trybie demona:
twistd -oy stompclient.tac
Aplikacja wydaje się uruchamiać OK, ale kiedy próbuje rozwidlić pracę, po prostu się zawiesza. Przez "zawiesza się", mam na myśli to, że wygląda na to, że proces potomny nigdy nie jest proszony o nic, a rodzic (który nazywa się pool.apply_async()) siedzi po prostu czekając na odpowiedź, aby powrócić.
Jestem pewien, że robię coś głupiego z Twisted + multiprocessing, ale naprawdę mam nadzieję, że ktoś może wyjaśnić moją wadę w moim podejściu.
Z góry dziękuję!
To było * niezwykle * pomocne. Dziękuję Ci! –