2009-03-18 18 views
51

के साथ संचार करना मैंने एक छोटा पायथन एप्लिकेशन लिखा जो डेमन के रूप में चलता है। यह थ्रेडिंग और कतार का उपयोग करता है।एक चल रहे पायथन डेमन

मैं इस एप्लिकेशन को बदलने के लिए सामान्य दृष्टिकोण की तलाश में हूं ताकि मैं इसे चलाने के दौरान इसके साथ संवाद कर सकूं। अधिकतर मैं अपने स्वास्थ्य की निगरानी करने में सक्षम होना चाहता हूं।

संक्षेप में, मैं इस तरह कुछ करने के लिए सक्षम होने के लिए करना चाहते हैं:

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

python application.py start # launches the daemon 

बाद में, मैं के साथ आने के लिए सक्षम हो सकता है और कुछ ऐसा करना चाहते हैं

स्पष्ट होने के लिए, मुझे Django- प्रेरित वाक्यविन्यास को लागू करने में कोई समस्या नहीं है। मुझे क्या पता नहीं है कि कैसे करना है डिमनीकृत प्रक्रिया (प्रारंभ), या इस तरह के संकेतों को संभालने और प्रतिक्रिया देने के लिए डिमन लिखने के लिए सिग्नल भेजना है।

जैसा कि मैंने उपरोक्त कहा है, मैं सामान्य दृष्टिकोण की तलाश में हूं। केवल एक ही मैं देख सकता हूं कि डिमन लगातार फाइल को जरूरी सबकुछ लॉग कर रहा है, लेकिन मुझे उम्मीद है कि इसके बारे में जाने के लिए एक कम गन्दा तरीका है।

अद्यतन: वाह, बहुत सारे अच्छे उत्तर। बहुत बहुत धन्यवाद। मुझे लगता है कि मैं पाइरो और web.py/Werkzeug दृष्टिकोण दोनों को देखूंगा, क्योंकि ट्विस्टेड इस बिंदु पर काटने से थोड़ा अधिक है। मुझे लगता है कि अगली वैचारिक चुनौती, मुझे अपने लटकने वाले धागे से बात करने के बारे में बात करने के बारे में है।

फिर से धन्यवाद।

उत्तर

19

इसे http सर्वर चलाने के बारे में क्या?

यह पागलपन है, लेकिन अपने सर्वर की व्यवस्था के लिए एक सरल वेब सर्वर चल रहा है बस कुछ ही web.py

तुम भी एक यूनिक्स पाइप बनाने पर विचार कर सकते हैं का उपयोग कर लाइनों की आवश्यकता है।

+0

HTTP इंटरफ़ेस के लिए भी +1। एक पायथन स्क्रिप्ट कमांड लाइन विकल्पों को पार्स कर सकती है और एक आंतरिक HTTP सर्वर पर XMLRPC आदेश भेज सकती है। –

+0

+1: HTTP। अनुरोधों का जवाब देने के लिए डिमन में थोड़ा WSGI ऐप एम्बेड करें। –

+1

(और @ वानगेल और @ एसएलओटी) क्या कोई व्यक्ति ओपी जैसे आदेश प्राप्त करने के उद्देश्य से http सर्वर चलाने के लिए संदर्भ/उदाहरण प्रदान कर सकता है? मुझे ऐसा करने की ज़रूरत है, लेकिन थोड़ा और विस्तार करना चाहेंगे। – synaptik

5

मान लें कि आप * निक्स के अंतर्गत हैं, आप एक शेल से kill के साथ चल रहे प्रोग्राम (और कई अन्य वातावरण में एनालॉग) के साथ एक चल रहे प्रोग्राम को सिग्नल भेज सकते हैं। उन्हें अजगर के भीतर से संभालने के लिए signal मॉड्यूल देखें।

+0

क्या आप 'kill' के माध्यम से कोई सिग्नल भेज सकते हैं? यदि नहीं, तो संभवतः मेरे उत्तर के सर्वोत्तम रूप से 'हत्या' के रूप में इस उत्तर को दोबारा बताएं, केवल 'मार' सिग्नल भेज सकता है, जो विशेष रूप से उपयोगी नहीं है – puk

+0

@puk आप वास्तव में आप का उपयोग करके मारने के साथ अन्य सिग्नल भेजते हैं। 'पैरामीटर, उदाहरण के लिए 'हत्या-QUIT '। –

9

मैं एक नामित पाइप के साथ मुड़कर उपयोग करता हूं या बस एक सॉकेट खोलता हूं। गूंज सर्वर और क्लाइंट examples पर एक नज़र डालें। क्लाइंट द्वारा पारित कुछ स्ट्रिंग की जांच करने के लिए आपको गूंज सर्वर को संशोधित करने की आवश्यकता होगी और फिर जो भी अनुरोधित जानकारी के साथ जवाब दें।

पायथन के थ्रेडिंग मुद्दों के कारण आपको सूचना अनुरोधों का जवाब देने में परेशानी होगी, साथ ही साथ जो भी डेमॉन करने के लिए किया जाता है, वह करना जारी रखेगा। असीमित तकनीक या अन्य प्रक्रियाओं को फोर्क करना आपका एकमात्र वास्तविक विकल्प है।

+1

ट्विस्ट के लिए +1, यह भी देखें twisted.manhole जो चलने वाले दुभाषिया में सीधे टेलनेट इंटरफ़ेस प्रदान करता है: http://twistedmatrix.com/projects/core/documentation/howto/telnet.html –

+0

"[...] आप हैं सूचना अनुरोधों का जवाब देने में परेशानी होगी, साथ ही साथ जो कुछ भी करना है, वह करना चाहे जो भी है, " मुझे यह दावा असमर्थित लगता है। यदि आप जीआईएल का मतलब है, तो यह इस तरह की अव्यवस्था को रोकता नहीं है। –

+0

उम, वे "थ्रेडिंग मुद्दे" क्या होंगे? –

7
# 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() 

ग्राहक xmlrpclib का उपयोग कर लिखा जा सकता है, उदाहरण के कोड here की जाँच करें।

+0

आप आसानी से सर्वर और क्लाइंट को मोड़ के आधार पर लिख सकते हैं, लेकिन यह एक अच्छा जवाब है। –

16

werkzeug का उपयोग करें और अपने डेमॉन को HTTP- आधारित WSGI सर्वर शामिल करें।

आपके डेमॉन में स्थिति जानकारी के साथ प्रतिक्रिया देने के लिए छोटे डब्लूएसजीआई ऐप्स का संग्रह है।

आपका क्लाइंट बस POST बनाने या स्थानीयहोस्ट को अनुरोध प्राप्त करने के लिए urllib2 का उपयोग करता है: somePort। आपके ग्राहक और सर्वर को पोर्ट नंबर (और यूआरएल) पर सहमत होना चाहिए।

यह लागू करने और बहुत स्केलेबल करने के लिए बहुत आसान है। नए आदेश जोड़ना एक मामूली व्यायाम है।

ध्यान दें कि आपके डिमन को HTML में जवाब देना नहीं है (हालांकि यह अक्सर आसान होता है)। हमारे डेमॉन जेएसओएन-एनकोडेड स्टेटस ऑब्जेक्ट्स के साथ डब्लूएसजीआई-अनुरोधों का जवाब देते हैं।

34

फिर भी एक और दृष्टिकोण: Pyro (पायथन रिमोटिंग ऑब्जेक्ट्स) का उपयोग करें।

पायरो मूल रूप से आपको पाइथन ऑब्जेक्ट इंस्टेंस को उन सेवाओं के रूप में प्रकाशित करने की अनुमति देता है जिन्हें दूरस्थ रूप से कहा जा सकता है। मैंने आपके द्वारा वर्णित सटीक उद्देश्य के लिए पाइरो का उपयोग किया है, और मैंने इसे बहुत अच्छी तरह से काम करने के लिए पाया है।

डिफ़ॉल्ट रूप से, एक पाइरो सर्वर डिमन हर जगह से कनेक्शन स्वीकार करता है। इसे सीमित करने के लिए, या तो स्थानीय कनेक्शन के लिए सुनने के लिए Daemon कन्स्ट्रक्टर में कनेक्शन सत्यापनकर्ता (दस्तावेज़ीकरण देखें) का उपयोग करें, या host='127.0.0.1' की आपूर्ति करें।

उदाहरण Pyro प्रलेखन से लिया कोड:

सर्वर

 
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() 

ग्राहक

 
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") 

एक और ऐसी ही परियोजना RPyC है। मैंने आरपीवाईसी की कोशिश नहीं की है।

4

आप इसे पायरो (http://pythonhosted.org/Pyro4/) पायथन रिमोट ऑब्जेक्ट से जोड़ सकते हैं। यह आपको पाइथन वस्तुओं को दूरस्थ रूप से एक्सेस करने देता है। यह आसानी से कार्यान्वित करने के लिए है, कम ओवरहेड है, और मुड़ के रूप में आक्रामक नहीं है।

+0

मुझे लगता है कि आपके द्वारा पाइरो के लिए प्रदान किया गया लिंक कुछ अन्य पाइरो (एक थर्मोडायनामिक्स विश्लेषण सॉफ़्टवेयर) है, जो आपको लगता है कि यह नहीं है (या यह कम से कम अब है)। – ironstein

+0

चीजें सात साल से अधिक बदलती हैं। मैंने वर्तमान रेपो के साथ अद्यतन किया है। – directedition

संबंधित मुद्दे