Komunikacja z uruchomionym demonem Pythona

Napisałem małą aplikację Pythona, która działa jako demon. Wykorzystuje wątki i kolejki.

Szukam ogólnego podejścia do zmiany tej aplikacji, aby móc komunikować się z nią podczas jej działania. Głównie chciałbym być w stanie monitorować jego stan zdrowia.

W skrócie, chciałbym móc zrobić coś takiego:

python application.py start  # launches the daemon

Później chciałbym móc przyjść i zrobić coś w stylu:

python application.py check_queue_size  # return info from the daemonized process

Żeby było jasne, nie mam żadnego problemu implementacja składni inspirowanej Django. Nie mam jednak pojęcia, jak wysłać sygnały do demonizowanego procesu (start), ani Jak napisać demona do obsługi i odpowiedzi na takie sygnały.

Jak powiedziałem powyżej, Szukam podejścia ogólnego. Jedyne, co teraz widzę, to mówienie daemonowi, że ciągle loguje wszystko, co może być potrzebne do pliku, ale mam nadzieję, że jest mniej bałaganu.

UPDATE: Wow, dużo świetnych odpowiedzi. Dzięki. much. Myślę, że przyjrzę się zarówno Pyro, jak i web.py/Werkzeug podejścia, ponieważ Twisted jest trochę więcej niż chcę odgryźć w tym momencie. Następnym wyzwaniem koncepcyjnym, jak sądzę, jest to, jak rozmawiać z moimi wątkami pracowniczymi bez ich odkładania.

Jeszcze raz dziękuję.
Author: hanksims, 2009-03-18

7 answers

A co z uruchomieniem serwera http?

Wydaje się szalone, ale uruchamianie prostego serwera www do administrowania Twoim serwer wymaga tylko kilku linijek za pomocą web.py

Możesz również rozważyć utworzenie uniksowego potoku.

 18
Author: fulmicoton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-18 10:04:48

Jeszcze jedno podejście: użyj Pyro (Python remoting objects).

Pyro zasadniczo pozwala publikować instancje obiektów Pythona jako usługi, które mogą być wywoływane zdalnie. Użyłem Pyro do dokładnie opisanego celu i uznałem, że działa bardzo dobrze.

Domyślnie Demon serwera Pyro akceptuje połączenia zewsząd. Aby to ograniczyć, użyj walidatora połączenia (patrz dokumentacja) lub dostarcz host='127.0.0.1' do konstruktora Daemon, aby słuchać tylko lokalnego znajomości.

Przykładowy kod zaczerpnięty z dokumentacji Pyro:

Serwer

import Pyro.core

class JokeGen(Pyro.core.ObjBase):
        def __init__(self):
                Pyro.core.ObjBase.__init__(self)
        def joke(self, name):
                return "Sorry "+name+", I don't know any jokes."

Pyro.core.initServer()
daemon=Pyro.core.Daemon()
uri=daemon.connect(JokeGen(),"jokegen")

print "The daemon runs on port:",daemon.port
print "The object's uri is:",uri

daemon.requestLoop()

Klient

import Pyro.core

# you have to change the URI below to match your own host/port.
jokes = Pyro.core.getProxyForURI("PYROLOC://localhost:7766/jokegen")

print jokes.joke("Irmen")

Innym podobnym projektem jest RPyC . Nie próbowałem RPyC.

 34
Author: codeape,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-01 04:05:36

Użyj werkzeug i spraw, aby twój Demon zawierał serwer WSGI oparty na HTTP.

Twój Demon ma kolekcję małych aplikacji WSGI, które odpowiadają informacjami o stanie.

Twój klient po prostu używa urllib2 do wysyłania postów lub otrzymywania żądań do localhost: somePort. Twój klient i serwer muszą uzgodnić numer portu (i adres URL).

Jest to bardzo proste do wdrożenia i bardzo skalowalne. Dodawanie nowych poleceń to trywialne ćwiczenie.

Zauważ, że Twój Demon Nie trzeba odpowiedzieć w HTML (to często proste, choć). Nasze demony odpowiadają na żądania WSGI za pomocą zakodowanych w JSON obiektów statusu.

 16
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-29 19:48:53

Użyłbym skrętki z nazwą rury lub po prostu otworzyć Gniazdo. Spójrz na przykład serwera echo i klienta . Trzeba by zmodyfikować serwer echo, aby sprawdzić jakiś ciąg przekazany przez Klienta, a następnie odpowiedzieć z żądanych informacji.

Z powodu problemów z wątkami w Pythonie będziesz miał problemy z odpowiadaniem na żądania informacji, jednocześnie kontynuując robienie tego, co Demon ma robić. Techniki asynchroniczne lub rozwidlenie innych procesów jest jedyną realną opcją.

 9
Author: MrEvil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-18 05:04:08
# your server

from twisted.web import xmlrpc, server
from twisted.internet import reactor

class MyServer(xmlrpc.XMLRPC):

    def xmlrpc_monitor(self, params):        
        return server_related_info

if __name__ == '__main__':
    r = MyServer()
    reactor.listenTCP(8080, Server.Site(r))
    reactor.run()

Klient może być napisany przy użyciu xmlrpclib, sprawdź przykładowy kod Tutaj .

 7
Author: Badri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-18 05:38:27

Zakładając, że jesteś pod *nix, możesz wysyłać sygnały do uruchomionego programu za pomocą kill z powłoki (i analogów w wielu innych środowiskach). Aby obsłużyć je z poziomu Pythona, sprawdź moduł signal .

 5
Author: MarkusQ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-18 04:47:33

Możesz powiązać go z Pyro ( http://pythonhosted.org/Pyro4 / ) odległy obiekt Pythona. Umożliwia zdalny dostęp do obiektów Pythona. Jest łatwy do wdrożenia, ma niski koszt i nie jest tak inwazyjny, jak skręcony.

 4
Author: directedition,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-10 12:21:38