2012-08-03 16 views
6

Przepraszamy za niewyraźny tytuł, ale nie mogłem wymyślić czegoś lepszego.Twisted reaktor otrzymuję aktualny status

Czy istnieją sposoby na skręcenie obecnego stanu reaktora? Wg stanu Znaczy:

  • słuchaczy w portach
  • Connected protokoły
  • Deferreds które czekają aby być zwolniony
  • LoopingCalls uruchomione
  • wątki, które są "idle"
  • i inne "aktywne" rzeczy ...

Zasadniczo Próbuję dowiedzieć się, czy reaktor po prostu siedzi bezczynnie. Samo pytanie jest szersze niż to, co faktycznie muszę zrobić, ze względu na kompletność dla stackoverflow.

Teraz moja obecna sytuacja przedstawia się następująco:

używam cudzego scenariusza, który nasłuchuje na wielu „dynamiczne” portów, które zostały wybrane przez skrypt tej osoby, więc nie można po prostu użyć mojego skryptu wykonaj coś w stylu nasłuchuTCP lub TCP4ServerEndpoint i sprawdź jego status. Jest to trochę podobne do FTP innego niż PASV, w którym każdy port nasłuchujący jest odrzucany po każdym użyciu. Innym problemem jest to, że mój własny mały program działa również w tym samym procesie, którego używam jako argumentu do uruchomienia jego programu. Jest to w zasadzie interfejs do jego programu. Kiedy wszystkie jego rzeczy są zrobione I moje rzeczy są również zrobione, chcę zamknąć reaktor. W ten sposób próbuję ustalić, kiedy mogę zatrzymać reaktor. Mój dokładny warunek zamknięcia jest następujący:

  • Słuchanie tylko na jednym porcie i żadne inne.
  • Bez żadnych efektów ani pętli Zwolnienia, które będą uruchamiane.

Szukałem, ale znalazłem tylko takie rzeczy, jak "if reaktor.running" lub Stop twisted reactor on a condition, które należy śledzić za pomocą flag. Wolałbym nie dotykać jego kodu. Jeśli jest to coś, co może przyczynić się do skręcenia, wolałbym to zrobić. Ale jeśli istnieje już alternatywa, wolałbym nie wymyślać ponownie koła.

Czy jego skrypt musi zostać zmieniony, aby powiadomił mój skrypt o tych warunkach?

Odpowiedz

2

Kod, do którego dzwonisz, powinien zostać refaktoryzowany, aby zwrócić coś od kogoś; prawdopodobnie implementacja IService.stopService, która to zatrzymuje. Powodem, aby to zrobić w ten sposób, jest to, że nie zawsze wiesz, co będzie siedzieć w reaktorze, nawet gdy rzeczy są najwyraźniej "bezczynne". Na przykład, czy wiesz, że Twisted utrzymuje deskryptor pliku ("waker") do komunikacji z wątków? Czy serwer HTTP zachowuje zawsze niezmienną wartość callLater, aby zapisać następny wpis w dzienniku dostępu? Inne fragmenty infrastruktury w bibliotekach stron trzecich mogą pozostawić arbitralnie inny stan w reaktorze, który w rzeczywistości nie jest żadnym z twoich przedsiębiorstw.

Reaktor ma jednak niewielkie wsparcie introspekcji. Na przykład: IReactorTime.getDelayedCalls, IReactorFDSet.getReaders/getWriters i IReactorThreads.getThreadPool.Jednak nie ma żadnego IReactorWin32Events.getAllEvents, więc nie jest to całkowicie przenośny zestaw rzeczy. Z pewnością docenilibyśmy to, gdybyście chcieli wnieść więcej implementacji introspekcji reaktora, do celów diagnostycznych i debugowania.

+0

Dzięki Glyph za odpowiedź. – SleepyMan

+0

Dzięki @Glyph za odpowiedź. Wciśnięty Wprowadź nawyk. Naprawdę nie chciałem zadzierać z jego kodeksem, bo moja filozofia kłóci się z jego. Ale w jaki sposób mogę zintegrować mój kod z jego z IService? Różne procesy komunikujące się za pośrednictwem gniazd? Cóż, tak czy siak, powiadomię go, że jego scenariusz wymaga zmian. W międzyczasie postaram się nauczyć nieco więcej o wewnętrznych elementach skręconych, zanim włączyłem się (myślę, że dobrze jest poznać filozofię Twisted, prawda?). Czy jedynym sposobem nauczenia się tych rzeczy jest odczytanie źródła lub czy jest ono gdzieś udokumentowane? – SleepyMan